commit
5af29cb9f1
41 changed files with 2756 additions and 0 deletions
@ -0,0 +1,40 @@ |
|||
## Hr Server项目结构 |
|||
|
|||
```Project |
|||
|—— api |
|||
| └── version1 |
|||
|—— router |
|||
|—— initialization |
|||
| └── database |
|||
| └── nosql |
|||
| └── app |
|||
| └── route |
|||
|—— config |
|||
| └── database |
|||
| └── nosql |
|||
| └── app |
|||
|—— models |
|||
|—— overall |
|||
|—— middleware |
|||
``` |
|||
## Hr 文件结构说明 |
|||
|
|||
| 文件夹 | 说明 | 描述| |
|||
|--------- |------ |-----| |
|||
| `api` | api相关业务 | api业务实现 | |
|||
| `--version1` | 业务版本文件夹 | 版本界定 | |
|||
| `router` | 路由器 | 业务路由设定 | |
|||
| `initialization` | 初始化相关业务 | 系统初始化方面的实现 | |
|||
| `--database` | 数据库业务 | 数据库业务初始化实现 | |
|||
| `--nosql` | nosql数据库业务 | nosql业务初始化实现(例:Redis) | |
|||
| `--app` | app数据库业务 | app业务初始化实现 | |
|||
| `--route` | 路由初始化 | 路由初始化 | |
|||
| `config` | 系统配置相关业务 | 系统系统配置方面的实现 | |
|||
| `--database` | 数据库业务 | 数据库业务系统配置实现 | |
|||
| `--nosql` | nosql数据库业务 | nosql业务系统配置实现(例:Redis) | |
|||
| `--app` | app数据库业务 | app业务系统配置实现 | |
|||
| `models` | 数据模型 | 数据库方面的配置 | |
|||
| `overall` | 全局对象 | 全局对象| |
|||
| `middleware` | 中间件 | 中间件 | |
|||
|
|||
## Log |
|||
@ -0,0 +1,256 @@ |
|||
package administrativeorganization |
|||
|
|||
import ( |
|||
"fmt" |
|||
"hr_server/models" |
|||
"hr_server/overall" |
|||
"hr_server/overall/overallhandle" |
|||
"strconv" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//职务
|
|||
func (o *OrganizationApi) DutiesList(c *gin.Context) { |
|||
var requestData dutiesListType |
|||
c.ShouldBindJSON(&requestData) |
|||
// err := c.ShouldBindJSON(&requestData)
|
|||
// if err != nil {
|
|||
// overallhandle.Result(100, err, c)
|
|||
// return
|
|||
// }
|
|||
if requestData.Page < 0 { |
|||
requestData.Page = 1 |
|||
} |
|||
if requestData.PageSize < 0 { |
|||
requestData.PageSize = 10 |
|||
} |
|||
var dutiesList []dutiesOutCont |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&models.Duties{}).Select("duties.*,job_class.name as classname").Joins("left join job_class on job_class.id = duties.job_type") |
|||
if requestData.Name != "" { |
|||
gormDb = gormDb.Where("duties.name LIKE ?", "%"+requestData.Name+"%") |
|||
} |
|||
if requestData.JobId != "" { |
|||
gormDb = gormDb.Where("duties.job_type = ?", requestData.JobId) |
|||
} |
|||
gormDb = gormDb.Where("duties.state IN ?", []int{1, 2}) |
|||
var total int64 |
|||
totalErr := gormDb.Count(&total).Error |
|||
if totalErr != nil { |
|||
total = 0 |
|||
} |
|||
errGorm := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&dutiesList).Error |
|||
if errGorm != nil { |
|||
overallhandle.Result(105, errGorm, c) |
|||
} else { |
|||
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(dutiesList)), dutiesList, c) |
|||
} |
|||
} |
|||
|
|||
//添加职务
|
|||
func (o *OrganizationApi) AddDutiesCont(c *gin.Context) { |
|||
var requestData addDutiesInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Name == "" { |
|||
overallhandle.Result(101, err, c, "职务名称为空!") |
|||
return |
|||
} |
|||
if requestData.JobType == "" { |
|||
overallhandle.Result(101, err, c, "请指定归属职务类型!") |
|||
return |
|||
} |
|||
if requestData.Weight == 0 { |
|||
requestData.Weight = 1 |
|||
} |
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.Duties{}).Select("`name`").Where("`name` = ?", requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c) |
|||
return |
|||
} |
|||
var saveData models.Duties |
|||
saveData.Name = requestData.Name |
|||
jobTypeId, _ := strconv.ParseInt(requestData.JobType, 10, 64) |
|||
saveData.JobType = jobTypeId |
|||
saveData.Weight = requestData.Weight |
|||
saveData.Time = time.Now().Unix() |
|||
saveData.State = 1 |
|||
if requestData.Number == "" { |
|||
requestData.Number = getDutiesNumber() |
|||
} |
|||
saveData.Number = requestData.Number |
|||
saveErr := overall.CONSTANT_DB_HR.Create(&saveData).Error |
|||
if saveErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(104, saveErr, c) |
|||
} |
|||
} |
|||
|
|||
//获取职务编号
|
|||
func getDutiesNumber() (number string) { |
|||
var countId int64 |
|||
overall.CONSTANT_DB_HR.Model(&models.Duties{}).Select("`id`").Pluck("COALESCE(COUNT(`id`), 0) as countid", &countId) |
|||
versioNum := "0001" |
|||
if countId != 0 { |
|||
countId++ |
|||
// chuShu := 10000
|
|||
// if countId > 9999 {
|
|||
// chuShu = 100000000
|
|||
// }
|
|||
// versioNumStr := strconv.FormatFloat(countId/float64(chuShu), 'f', -1, 64)
|
|||
// versioNumAry := strings.Split(versioNumStr, ".")
|
|||
// if len(versioNumAry) == 2 {
|
|||
// versioNum = versioNumAry[1]
|
|||
// }
|
|||
if countId > 9999 { |
|||
versioNum = overallhandle.ZeroFillByStr(strconv.FormatInt(countId, 10), 8, true) |
|||
} else { |
|||
versioNum = overallhandle.ZeroFillByStr(strconv.FormatInt(countId, 10), 4, true) |
|||
} |
|||
|
|||
} |
|||
number = fmt.Sprintf("ZW%v%v", overallhandle.UnixTimeToDay(time.Now().Unix(), 20), versioNum) |
|||
return |
|||
} |
|||
|
|||
//获取职务详情
|
|||
func (o *OrganizationApi) GetDutiesCont(c *gin.Context) { |
|||
var requestData overallhandle.GetId |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
var duriesCont dutiesOutCont |
|||
dbErr := overall.CONSTANT_DB_HR.Select("duties.*,job_class.name as classname").Where("duties.id = ?", requestData.Id).Joins("left join job_class on job_class.id = duties.job_type").First(&duriesCont).Error |
|||
if dbErr != nil { |
|||
overallhandle.Result(105, dbErr, c) |
|||
} else { |
|||
overallhandle.Result(0, duriesCont, c) |
|||
} |
|||
} |
|||
|
|||
//修改职务
|
|||
func (o *OrganizationApi) EiteDutiesInfo(c *gin.Context) { |
|||
var requestData eiteDutiesCont |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
whereData := overallhandle.MapOut() |
|||
whereData["id"] = requestData.Id |
|||
//判断职务是否存在
|
|||
var dutiesInfo models.Duties |
|||
judgeErr := overall.CONSTANT_DB_HR.Where(whereData).First(&dutiesInfo).Error |
|||
if judgeErr != nil { |
|||
overallhandle.Result(107, err, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
if requestData.Name != "" && requestData.Name != dutiesInfo.Name { |
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.Duties{}).Select("`name`").Where("`name` = ?", requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c, name) |
|||
return |
|||
} else { |
|||
saveData["name"] = requestData.Name |
|||
} |
|||
} |
|||
if requestData.JobType != "" { |
|||
saveData["job_type"] = requestData.JobType |
|||
} |
|||
if requestData.Weight != 0 { |
|||
saveData["weight"] = requestData.Weight |
|||
} |
|||
saveDataErr := dutiesInfo.EiteCont(whereData, saveData) |
|||
if saveDataErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(106, saveDataErr, c) |
|||
} |
|||
} |
|||
|
|||
//编辑状态或删除
|
|||
func (o *OrganizationApi) EiteDutiesStatOrDel(c *gin.Context) { |
|||
var requestData EiteJobStateDel |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
if requestData.State == 0 { |
|||
requestData.State = 1 |
|||
} |
|||
whereMap := overallhandle.MapOut() |
|||
whereMap["id"] = requestData.Id |
|||
var joInfo models.Duties |
|||
//判断职务类型是否存在
|
|||
judgeExist := overall.CONSTANT_DB_HR.Where(whereMap).First(&joInfo).Error |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
saveData["state"] = requestData.State |
|||
|
|||
if requestData.State != 3 { |
|||
eiteErr := joInfo.EiteCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
if requestData.IsTrue != 1 { |
|||
//软删除
|
|||
eiteErr := joInfo.EiteCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
//硬删除
|
|||
delErr := overall.CONSTANT_DB_HR.Where(whereMap).Delete(&joInfo) |
|||
if delErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(108, delErr, c) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,217 @@ |
|||
package administrativeorganization |
|||
|
|||
import ( |
|||
"hr_server/models" |
|||
"hr_server/overall" |
|||
"hr_server/overall/overallhandle" |
|||
"strconv" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//行政类型
|
|||
func (o *OrganizationApi) GovClassList(c *gin.Context) { |
|||
var requestData selectNameOrState |
|||
c.ShouldBindJSON(&requestData) |
|||
if requestData.Page < 0 { |
|||
requestData.Page = 1 |
|||
} |
|||
if requestData.PageSize < 0 { |
|||
requestData.PageSize = 10 |
|||
} |
|||
var govClassMap []models.AdministrativeOrganizationType |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganizationType{}) |
|||
if requestData.State != 0 { |
|||
gormDb = gormDb.Where("state = ?", requestData.State) |
|||
} else { |
|||
gormDb = gormDb.Where("state IN ?", []int{1, 2}) |
|||
} |
|||
if requestData.Name != "" { |
|||
gormDb = gormDb.Where("name LIKE ?", "%"+requestData.Name+"%") |
|||
} |
|||
if requestData.Level != 0 { |
|||
gormDb = gormDb.Where("`level` = ?", requestData.Level) |
|||
} |
|||
var total int64 |
|||
totalErr := gormDb.Count(&total).Error |
|||
if totalErr != nil { |
|||
total = 0 |
|||
} |
|||
errGorm := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&govClassMap).Error |
|||
if errGorm != nil { |
|||
overallhandle.Result(105, errGorm, c) |
|||
} else { |
|||
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(govClassMap)), govClassMap, c) |
|||
} |
|||
} |
|||
|
|||
//添加行政组织类别
|
|||
func (o *OrganizationApi) AddGovClass(c *gin.Context) { |
|||
var requestData addGovClassInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Name == "" { |
|||
overallhandle.Result(101, err, c, "行政组织类别名称为空!") |
|||
return |
|||
} |
|||
if requestData.Level == 0 { |
|||
requestData.Level = 1 |
|||
} |
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganizationType{}).Select("`name`").Where("`name` = ?", requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c) |
|||
return |
|||
} |
|||
var saveData models.AdministrativeOrganizationType |
|||
saveData.Name = requestData.Name |
|||
saveData.Level = requestData.Level |
|||
saveData.Time = time.Now().Unix() |
|||
saveData.State = 1 |
|||
saveErr := overall.CONSTANT_DB_HR.Create(&saveData).Error |
|||
if saveErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(104, saveErr, c) |
|||
} |
|||
} |
|||
|
|||
//获取行政组织类别详情
|
|||
func (o *OrganizationApi) GetGovClassCont(c *gin.Context) { |
|||
var requestData overallhandle.GetId |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政组织类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
var Contents models.AdministrativeOrganizationType |
|||
dbErr := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).First(&Contents).Error |
|||
if dbErr != nil { |
|||
overallhandle.Result(105, dbErr, c) |
|||
} else { |
|||
overallhandle.Result(0, Contents, c) |
|||
} |
|||
} |
|||
|
|||
//修改行政组织类别详情
|
|||
func (o *OrganizationApi) EiteGovClassCont(c *gin.Context) { |
|||
var requestData eiteGovClassInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
gormDb := overall.CONSTANT_DB_HR |
|||
var jobClassInfo models.AdministrativeOrganizationType |
|||
//判断职务类型是否存在
|
|||
judgeExist := gormDb.Where("`id` = ?", requestData.Id).First(&jobClassInfo).Error |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
|
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
if requestData.Name != "" { |
|||
if requestData.Name != jobClassInfo.Name { |
|||
//查询一下修改的职务名称是否已经存在
|
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganizationType{}).Select("`name`").Where("`name` = ?", requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c) |
|||
return |
|||
} |
|||
saveData["name"] = requestData.Name |
|||
} |
|||
} |
|||
if requestData.Level != 0 { |
|||
saveData["level"] = requestData.Level |
|||
} |
|||
whereMap := overallhandle.MapOut() |
|||
whereMap["id"] = requestData.Id |
|||
eiteErr := jobClassInfo.EiteCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} |
|||
|
|||
//修改行政类别状态或删除
|
|||
func (o *OrganizationApi) EiteGovClassStateOrDel(c *gin.Context) { |
|||
var requestData EiteJobStateDel |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
if requestData.State == 0 { |
|||
requestData.State = 1 |
|||
} |
|||
var jobClassInfo models.AdministrativeOrganizationType |
|||
//判断职务类型是否存在
|
|||
judgeExist := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).First(&jobClassInfo).Error |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
saveData["state"] = requestData.State |
|||
whereMap := overallhandle.MapOut() |
|||
whereMap["id"] = requestData.Id |
|||
if requestData.State != 3 { |
|||
eiteErr := jobClassInfo.EiteCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
if requestData.IsTrue != 1 { |
|||
//软删除
|
|||
eiteErr := jobClassInfo.EiteCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
//硬删除
|
|||
delErr := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).Delete(&jobClassInfo) |
|||
if delErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(108, delErr, c) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,265 @@ |
|||
package administrativeorganization |
|||
|
|||
import ( |
|||
"hr_server/models" |
|||
"hr_server/overall" |
|||
"hr_server/overall/overallhandle" |
|||
"strconv" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//行政组织
|
|||
func (o *OrganizationApi) GovList(c *gin.Context) { |
|||
var requestData govListType |
|||
c.ShouldBindJSON(&requestData) |
|||
if requestData.Page < 0 { |
|||
requestData.Page = 1 |
|||
} |
|||
if requestData.PageSize < 0 { |
|||
requestData.PageSize = 10 |
|||
} |
|||
var govClassMap []outGovCont |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("administrative_organization.*,aot.name as classname,aot.level").Joins("left join administrative_organization_type as aot on aot.id = administrative_organization.organization_type") |
|||
if requestData.State != 0 { |
|||
gormDb = gormDb.Where("administrative_organization.state = ?", requestData.State) |
|||
} else { |
|||
gormDb = gormDb.Where("administrative_organization.state IN ?", []int{1, 2}) |
|||
} |
|||
if requestData.Name != "" { |
|||
gormDb = gormDb.Where("(administrative_organization.name LIKE ? OR administrative_organization.abbreviation LIKE ?)", "%"+requestData.Name+"%", "%"+requestData.Name+"%") |
|||
} |
|||
if requestData.Number != "" { |
|||
gormDb = gormDb.Where("administrative_organization.number LIKE ?", "%"+requestData.Number+"%") |
|||
} |
|||
if requestData.Level != 0 { |
|||
gormDb = gormDb.Where("aot.level = ?", requestData.Level) |
|||
} |
|||
if requestData.GovClass != "" { |
|||
gormDb = gormDb.Where("administrative_organization.organization_type = ?", requestData.GovClass) |
|||
} |
|||
if requestData.Superior != "" { |
|||
gormDb = gormDb.Where("administrative_organization.superior = ?", requestData.Superior) |
|||
} |
|||
var total int64 |
|||
totalErr := gormDb.Count(&total).Error |
|||
if totalErr != nil { |
|||
total = 0 |
|||
} |
|||
errGorm := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&govClassMap).Error |
|||
if errGorm != nil { |
|||
overallhandle.Result(105, errGorm, c) |
|||
} else { |
|||
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(govClassMap)), govClassMap, c) |
|||
} |
|||
} |
|||
|
|||
//添加行政组织
|
|||
func (o *OrganizationApi) AddGovCont(c *gin.Context) { |
|||
var requestData addGovInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Name == "" { |
|||
overallhandle.Result(101, requestData.Name, c, "行政组织名称为空!") |
|||
return |
|||
} |
|||
var superiorId int64 = 0 |
|||
if requestData.Superior != "" { |
|||
superiorInt, _ := strconv.ParseInt(requestData.Superior, 10, 64) |
|||
superiorId = superiorInt |
|||
} else { |
|||
overallhandle.Result(101, requestData.Superior, c, "请指定归属上级!") |
|||
return |
|||
} |
|||
var govClassId int64 = 0 |
|||
if requestData.GovClass == "" { |
|||
overallhandle.Result(101, requestData.GovClass, c, "请指定归属行政组织类型!") |
|||
return |
|||
} else { |
|||
govClassIdInt, _ := strconv.ParseInt(requestData.GovClass, 10, 64) |
|||
govClassId = govClassIdInt |
|||
} |
|||
if requestData.WechatId == 0 { |
|||
requestData.WechatId = 1 |
|||
} |
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("`name`").Where("`organization_type` IN ? AND `name` = ?", []int{1, 2}, requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c) |
|||
return |
|||
} |
|||
var saveData models.AdministrativeOrganization |
|||
saveData.Name = requestData.Name |
|||
saveData.Superior = superiorId |
|||
saveData.OrganizationType = govClassId |
|||
saveData.Abbreviation = requestData.Abbreviation |
|||
saveData.Time = time.Now().Unix() |
|||
saveData.State = 1 |
|||
saveData.WechatOrganizationId = int64(requestData.WechatId) |
|||
if requestData.Number != "" { |
|||
saveData.Number = requestData.Number |
|||
} else { |
|||
//获取首字母
|
|||
govFirstWords := overallhandle.GetGovFirstWords(requestData.Name, requestData.Abbreviation, requestData.GovClass, requestData.Superior) |
|||
saveData.Number = overallhandle.CreateNumber(govFirstWords, requestData.Superior) |
|||
} |
|||
saveErr := overall.CONSTANT_DB_HR.Create(&saveData).Error |
|||
if saveErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(104, saveErr, c) |
|||
} |
|||
} |
|||
|
|||
//获取行政组织详情
|
|||
func (o *OrganizationApi) GetGovCont(c *gin.Context) { |
|||
var requestData overallhandle.GetId |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政组织类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
whereAry := overallhandle.MapOut() |
|||
whereAry["id"] = requestData.Id |
|||
var Contents models.AdministrativeOrganization |
|||
dbErr := Contents.GetCont(whereAry) |
|||
// dbErr := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).First(&Contents).Error
|
|||
if dbErr != nil { |
|||
overallhandle.Result(105, dbErr, c) |
|||
} else { |
|||
overallhandle.Result(0, Contents, c) |
|||
} |
|||
} |
|||
|
|||
//编辑行政组织
|
|||
func (o *OrganizationApi) EiteGovCont(c *gin.Context) { |
|||
var requestData eiteGovInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
whereAry := overallhandle.MapOut() |
|||
whereAry["id"] = requestData.Id |
|||
var govCont models.AdministrativeOrganization |
|||
judgeErr := govCont.GetCont(whereAry) |
|||
if judgeErr != nil { |
|||
overallhandle.Result(107, judgeErr, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
if requestData.Name != "" && requestData.Name != govCont.Name { |
|||
saveData["name"] = requestData.Name |
|||
} |
|||
if requestData.Superior != "" && requestData.Superior != strconv.FormatInt(govCont.Superior, 10) { |
|||
saveData["superior"] = requestData.Superior |
|||
} |
|||
|
|||
if requestData.GovClass != "" && requestData.GovClass != strconv.FormatInt(govCont.OrganizationType, 10) { |
|||
saveData["organization_type"] = requestData.GovClass |
|||
} |
|||
if requestData.Abbreviation != "" && requestData.Abbreviation != govCont.Abbreviation { |
|||
saveData["abbreviation"] = requestData.Abbreviation |
|||
} |
|||
if requestData.WechatId != 0 && int64(requestData.WechatId) != govCont.WechatOrganizationId { |
|||
saveData["wechat_organization_id"] = requestData.WechatId |
|||
} |
|||
if requestData.Number != "" && requestData.Number != govCont.Number { |
|||
if requestData.Superior != "" && requestData.Superior != strconv.FormatInt(govCont.Superior, 10) { |
|||
//获取首字母
|
|||
govFirstWords := overallhandle.GetGovFirstWords(requestData.Name, requestData.Abbreviation, requestData.GovClass, requestData.Superior) |
|||
saveData["number"] = overallhandle.CreateNumber(govFirstWords, requestData.Superior) |
|||
} else if requestData.Superior != "" { |
|||
saveData["number"] = requestData.Number |
|||
} |
|||
} |
|||
eiteErr := govCont.EiteCont(whereAry, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} |
|||
|
|||
//编辑行政组织状态或删除
|
|||
func (o *OrganizationApi) EiteGovStateOrDel(c *gin.Context) { |
|||
var requestData EiteJobStateDel |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
if requestData.State == 0 { |
|||
requestData.State = 1 |
|||
} |
|||
|
|||
whereAry := overallhandle.MapOut() |
|||
whereAry["id"] = requestData.Id |
|||
|
|||
var jobClassInfo models.AdministrativeOrganization |
|||
//判断行政组织是否存在
|
|||
judgeExist := jobClassInfo.GetCont(whereAry) |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
saveData["state"] = requestData.State |
|||
|
|||
if requestData.State != 3 { |
|||
eiteErr := jobClassInfo.EiteCont(whereAry, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
if requestData.IsTrue != 1 { |
|||
//软删除
|
|||
eiteErr := jobClassInfo.EiteCont(whereAry, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
//硬删除
|
|||
delErr := overall.CONSTANT_DB_HR.Where(whereAry).Delete(&jobClassInfo) |
|||
if delErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(108, delErr, c) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,209 @@ |
|||
package administrativeorganization |
|||
|
|||
import ( |
|||
"hr_server/models" |
|||
"hr_server/overall" |
|||
"hr_server/overall/overallhandle" |
|||
"strconv" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//职务分类列表
|
|||
func (o *OrganizationApi) DutiesClassList(c *gin.Context) { |
|||
var requestData JobClassPageSelect |
|||
c.ShouldBindJSON(&requestData) |
|||
if requestData.Page < 0 { |
|||
requestData.Page = 1 |
|||
} |
|||
if requestData.PageSize < 0 { |
|||
requestData.PageSize = 10 |
|||
} |
|||
var jobClassList []models.JobClass |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&models.JobClass{}) |
|||
if requestData.Name != "" { |
|||
// nameFactor := fmt.Sprintf("%%v%")
|
|||
gormDb = gormDb.Where("`name` LIKE ?", "%"+requestData.Name+"%") |
|||
} |
|||
gormDb = gormDb.Where("state IN ?", []int{1, 2}) |
|||
var total int64 |
|||
totalErr := gormDb.Count(&total).Error |
|||
if totalErr != nil { |
|||
total = 0 |
|||
} |
|||
errGorm := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&jobClassList).Error |
|||
if errGorm != nil { |
|||
overallhandle.Result(105, errGorm, c) |
|||
} else { |
|||
// overallhandle.Result(0, jobClassList, c)
|
|||
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(jobClassList)), jobClassList, c) |
|||
} |
|||
} |
|||
|
|||
//添加职务分类
|
|||
func (o *OrganizationApi) AddDutiesClass(c *gin.Context) { |
|||
var requestData NameVal |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Name == "" { |
|||
overallhandle.Result(101, err, c, "职务分类名称为空!") |
|||
return |
|||
} |
|||
//判断该职务分类是否已经存在
|
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.JobClass{}).Select("`name`").Where("`name` = ?", requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c) |
|||
return |
|||
} |
|||
var jobClassCont models.JobClass |
|||
jobClassCont.Name = requestData.Name |
|||
jobClassCont.Time = time.Now().Unix() |
|||
jobClassCont.State = 1 |
|||
addDataErr := overall.CONSTANT_DB_HR.Create(&jobClassCont).Error |
|||
if addDataErr != nil { |
|||
overallhandle.Result(104, addDataErr, c) |
|||
} else { |
|||
overallhandle.Result(0, jobClassCont, c) |
|||
} |
|||
} |
|||
|
|||
//查看职务分类详情
|
|||
func (o *OrganizationApi) GetDutiesClassInfo(c *gin.Context) { |
|||
var requestData overallhandle.GetId |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
var jobClassCont models.JobClass |
|||
dbErr := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).First(&jobClassCont).Error |
|||
if dbErr != nil { |
|||
overallhandle.Result(105, dbErr, c) |
|||
} else { |
|||
overallhandle.Result(0, jobClassCont, c) |
|||
} |
|||
} |
|||
|
|||
//修改职务分类详情
|
|||
func (o *OrganizationApi) EiteDutiesClassInfo(c *gin.Context) { |
|||
var requestData EiteJobClassInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
gormDb := overall.CONSTANT_DB_HR |
|||
var jobClassInfo models.JobClass |
|||
//判断职务类型是否存在
|
|||
judgeExist := gormDb.Where("`id` = ?", requestData.Id).First(&jobClassInfo).Error |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
|
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
if requestData.Name != "" { |
|||
if requestData.Name != jobClassInfo.Name { |
|||
//查询一下修改的职务名称是否已经存在
|
|||
var name string |
|||
judgeErr := overall.CONSTANT_DB_HR.Model(&models.JobClass{}).Select("`name`").Where("`name` = ?", requestData.Name).First(&name).Error |
|||
if judgeErr == nil { |
|||
overallhandle.Result(103, name, c) |
|||
return |
|||
} |
|||
saveData["name"] = requestData.Name |
|||
} |
|||
} |
|||
if requestData.State != 0 { |
|||
saveData["state"] = requestData.State |
|||
} |
|||
whereMap := overallhandle.MapOut() |
|||
whereMap["id"] = requestData.Id |
|||
eiteErr := jobClassInfo.EiteJobClassCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} |
|||
|
|||
//删除职务分类
|
|||
func (o *OrganizationApi) DelDutiesClassInfo(c *gin.Context) { |
|||
var requestData EiteJobStateDel |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
if requestData.State == 0 { |
|||
requestData.State = 1 |
|||
} |
|||
var jobClassInfo models.JobClass |
|||
//判断职务类型是否存在
|
|||
judgeExist := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).First(&jobClassInfo).Error |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
saveData["state"] = requestData.State |
|||
whereMap := overallhandle.MapOut() |
|||
whereMap["id"] = requestData.Id |
|||
if requestData.State != 3 { |
|||
eiteErr := jobClassInfo.EiteJobClassCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
if requestData.IsTrue != 1 { |
|||
//软删除
|
|||
eiteErr := jobClassInfo.EiteJobClassCont(whereMap, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
//硬删除
|
|||
delErr := overall.CONSTANT_DB_HR.Where("`id` = ?", requestData.Id).Delete(&jobClassInfo) |
|||
if delErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(108, delErr, c) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,321 @@ |
|||
package administrativeorganization |
|||
|
|||
import ( |
|||
"fmt" |
|||
"hr_server/models" |
|||
"hr_server/overall" |
|||
"hr_server/overall/overallhandle" |
|||
"strconv" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//职位(岗位)列表
|
|||
func (o *OrganizationApi) PositionList(c *gin.Context) { |
|||
var requestData lookPositionList |
|||
c.ShouldBindJSON(&requestData) |
|||
if requestData.Page < 0 { |
|||
requestData.Page = 1 |
|||
} |
|||
if requestData.PageSize < 0 { |
|||
requestData.PageSize = 10 |
|||
} |
|||
// gormDb := overall.CONSTANT_DB_HR.Model(&models.JobClass{}).Select("").Joins("left join administrative_organization_type as aot on aot.id = administrative_organization.organization_type")
|
|||
var positionType models.Position |
|||
gormDb := overall.CONSTANT_DB_HR.Table(fmt.Sprintf("%s p", positionType.TableName())).Select("p.*,d.name as dutiesname,d.number as dutiesnumber,ao.name as aoname,ao.number as aonumber,j.name as jobname").Joins("left join duties as d on d.id = p.duties").Joins("left join administrative_organization as ao on ao.id = p.administrative_organization").Joins("left join job_class as j on j.id = d.job_type") |
|||
if requestData.Name != "" { |
|||
gormDb = gormDb.Where("p.name LIKE ?", "%"+requestData.Name+"%") |
|||
} |
|||
if requestData.Number != "" { |
|||
gormDb = gormDb.Where("p.number = ?", requestData.Number) |
|||
} |
|||
if requestData.Duties != "" { |
|||
gormDb = gormDb.Where("p.duties = ?", requestData.Duties) |
|||
} |
|||
if requestData.Organization != "" { |
|||
gormDb = gormDb.Where("p.administrative_organization = ?", requestData.Organization) |
|||
} |
|||
if requestData.InCharge != 0 { |
|||
gormDb = gormDb.Where("p.person_in_charge = ?", requestData.InCharge) |
|||
} |
|||
if requestData.Department != "" { |
|||
gormDb = gormDb.Where("p.department = ?", requestData.Department) |
|||
} |
|||
gormDb = gormDb.Where("p.state IN ?", []int{1, 2}) |
|||
var total int64 |
|||
totalErr := gormDb.Count(&total).Error |
|||
if totalErr != nil { |
|||
total = 0 |
|||
} |
|||
var positionAry []positionOutInfo |
|||
errGorm := gormDb.Limit(requestData.PageSize).Offset(overallhandle.LimitPage(requestData.Page, requestData.PageSize)).Find(&positionAry).Error |
|||
for i, v := range positionAry { |
|||
var getSpur models.Position |
|||
getWhe := overallhandle.MapOut() |
|||
getWhe["id"] = v.Superior |
|||
fmt.Printf("%v\n", v.Superior) |
|||
getSpur.GetCont(getWhe, "number", "name") |
|||
positionAry[i].SuperiorNumber = getSpur.Number |
|||
positionAry[i].SuperiorName = getSpur.Name |
|||
} |
|||
if errGorm != nil { |
|||
overallhandle.Result(105, errGorm, c) |
|||
} else { |
|||
overallhandle.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(positionAry)), positionAry, c) |
|||
} |
|||
} |
|||
|
|||
//添加职位(岗位)
|
|||
func (o *OrganizationApi) AddPositionCont(c *gin.Context) { |
|||
var requestData addPositionInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Number == "" { |
|||
overallhandle.Result(101, requestData.Number, c, "职位编码不能为空!") |
|||
return |
|||
} |
|||
if requestData.Name == "" { |
|||
overallhandle.Result(101, requestData.Name, c, "职位名称不能为空!") |
|||
return |
|||
} |
|||
var dutiesId int64 = 0 |
|||
if requestData.Duties == "" { |
|||
overallhandle.Result(101, requestData.Duties, c, "请指定该职位的职务!") |
|||
return |
|||
} else { |
|||
dutiesId, _ = strconv.ParseInt(requestData.Duties, 10, 64) |
|||
} |
|||
var organizationId int64 = 0 |
|||
if requestData.Organization == "" { |
|||
overallhandle.Result(101, requestData.Organization, c, "请指定该职位归属的行政组织!") |
|||
return |
|||
} else { |
|||
organizationId, _ = strconv.ParseInt(requestData.Organization, 10, 64) |
|||
} |
|||
var superiorInt int64 = 0 |
|||
if requestData.Superior != "" { |
|||
superiorInt, _ = strconv.ParseInt(requestData.Superior, 10, 64) |
|||
} |
|||
if requestData.InCharge == 0 { |
|||
requestData.InCharge = 2 |
|||
} |
|||
var departmentId int64 = 0 |
|||
if requestData.Department == "" { |
|||
overallhandle.Result(101, requestData.Organization, c, "请指定该职位归属的部门!") |
|||
return |
|||
} else { |
|||
departmentId, _ = strconv.ParseInt(requestData.Department, 10, 64) |
|||
} |
|||
var positionCont models.Position |
|||
//判断编号是否已经存在
|
|||
isNumExit := overallhandle.MapOut() |
|||
isNumExit["number"] = requestData.Number |
|||
judgeNumErr := positionCont.GetCont(isNumExit) |
|||
if judgeNumErr == nil { |
|||
overallhandle.Result(101, isNumExit, c, "该编号已经存在!请不要重复使用!") |
|||
return |
|||
} |
|||
//判断岗位名称是否已经存在
|
|||
isExit := overallhandle.MapOut() |
|||
isExit["department"] = departmentId |
|||
isExit["name"] = requestData.Name |
|||
judgeErr := positionCont.GetCont(isExit) |
|||
if judgeErr == nil { |
|||
overallhandle.Result(101, isExit, c, "该职位在本部门下已经存在!请不要重复添加") |
|||
return |
|||
} |
|||
positionCont.Number = requestData.Number |
|||
positionCont.Name = requestData.Name |
|||
positionCont.Duties = dutiesId |
|||
positionCont.AdministrativeOrganization = organizationId |
|||
positionCont.Superior = superiorInt |
|||
positionCont.PersonInCharge = requestData.InCharge |
|||
positionCont.Department = departmentId |
|||
positionCont.State = 1 |
|||
positionCont.Time = time.Now().Unix() |
|||
addDataErr := overall.CONSTANT_DB_HR.Create(&positionCont).Error |
|||
if addDataErr != nil { |
|||
overallhandle.Result(104, addDataErr, c) |
|||
} else { |
|||
overallhandle.Result(0, positionCont, c) |
|||
} |
|||
} |
|||
|
|||
//获取职位(岗位)详情
|
|||
func (o *OrganizationApi) GetPositionCont(c *gin.Context) { |
|||
var requestData overallhandle.GetId |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "职务分类Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
var positionType models.Position |
|||
var postCont positionOutInfo |
|||
dbErr := overall.CONSTANT_DB_HR.Model(&positionType).Select("position.*,d.name as dutiesname,d.number as dutiesnumber,ao.name as aoname,ao.number as aonumber,j.name as jobname").Joins("left join duties as d on d.id = position.duties").Joins("left join administrative_organization as ao on ao.id = position.administrative_organization").Joins("left join job_class as j on j.id = d.job_type").Where("position.id = ?", requestData.Id).First(&postCont).Error |
|||
if dbErr != nil { |
|||
overallhandle.Result(105, dbErr, c) |
|||
} else { |
|||
var getSpur models.Position |
|||
getWhe := overallhandle.MapOut() |
|||
getWhe["id"] = postCont.Superior |
|||
fmt.Printf("%v\n", postCont.Superior) |
|||
getSpur.GetCont(getWhe, "number", "name") |
|||
postCont.SuperiorNumber = getSpur.Number |
|||
postCont.SuperiorName = getSpur.Name |
|||
|
|||
overallhandle.Result(0, postCont, c) |
|||
} |
|||
} |
|||
|
|||
//编辑职位(岗位)
|
|||
func (o *OrganizationApi) EitePositionCont(c *gin.Context) { |
|||
var requestData eitePositionInfo |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
whereAry := overallhandle.MapOut() |
|||
whereAry["id"] = requestData.Id |
|||
var govCont models.Position |
|||
judgeErr := govCont.GetCont(whereAry) |
|||
if judgeErr != nil { |
|||
overallhandle.Result(107, judgeErr, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
if requestData.Number != "" && requestData.Number != govCont.Number { |
|||
isNumExit := overallhandle.MapOut() |
|||
isNumExit["number"] = requestData.Number |
|||
var govContNum models.Position |
|||
judgeNumErr := govContNum.GetCont(isNumExit, "id", "number") |
|||
if judgeNumErr == nil { |
|||
overallhandle.Result(101, isNumExit, c, "该编号已经存在!请不要重复使用!") |
|||
return |
|||
} |
|||
saveData["number"] = requestData.Number |
|||
} |
|||
departIsTrue := false |
|||
if requestData.Department != "" && requestData.Department != strconv.FormatInt(govCont.Department, 10) { |
|||
departIsTrue = true |
|||
saveData["department"] = requestData.Department |
|||
} |
|||
|
|||
if requestData.Name != "" && requestData.Name != govCont.Name { |
|||
if departIsTrue == true { |
|||
//判断岗位名称是否已经存在
|
|||
departmentId, _ := strconv.ParseInt(requestData.Department, 10, 64) |
|||
isExit := overallhandle.MapOut() |
|||
isExit["department"] = departmentId |
|||
isExit["name"] = requestData.Name |
|||
var govContName models.Position |
|||
judgeErr := govContName.GetCont(isExit, "id", "department", "name") |
|||
if judgeErr == nil { |
|||
overallhandle.Result(101, isExit, c, "该职位在本部门下已经存在!请不要重复添加") |
|||
return |
|||
} |
|||
} |
|||
saveData["name"] = requestData.Name |
|||
} |
|||
if requestData.Duties != "" && requestData.Duties != strconv.FormatInt(govCont.Duties, 10) { |
|||
saveData["duties"] = requestData.Duties |
|||
} |
|||
if requestData.Organization != "" && requestData.Organization != strconv.FormatInt(govCont.AdministrativeOrganization, 10) { |
|||
saveData["administrative_organization"] = requestData.Organization |
|||
} |
|||
if requestData.Superior != "" && requestData.Superior != strconv.FormatInt(govCont.Superior, 10) { |
|||
saveData["superior"] = requestData.Superior |
|||
} |
|||
if requestData.InCharge != 0 { |
|||
saveData["person_in_charge"] = requestData.InCharge |
|||
} |
|||
eiteErr := govCont.EiteCont(whereAry, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} |
|||
|
|||
//编辑职位(岗位)状态或删除
|
|||
func (o *OrganizationApi) EitePositionStateOrDel(c *gin.Context) { |
|||
var requestData EiteJobStateDel |
|||
err := c.ShouldBindJSON(&requestData) |
|||
if err != nil { |
|||
overallhandle.Result(100, err, c) |
|||
return |
|||
} |
|||
if requestData.Id == 0 && requestData.IdStr == "" { |
|||
overallhandle.Result(101, err, c, "行政类别Id不能为空!") |
|||
return |
|||
} |
|||
if requestData.IdStr != "" { |
|||
idInt64, _ := strconv.ParseInt(requestData.IdStr, 10, 64) |
|||
requestData.Id = idInt64 |
|||
} |
|||
if requestData.State == 0 { |
|||
requestData.State = 1 |
|||
} |
|||
|
|||
whereAry := overallhandle.MapOut() |
|||
whereAry["id"] = requestData.Id |
|||
|
|||
var jobClassInfo models.Position |
|||
//判断行政组织是否存在
|
|||
judgeExist := jobClassInfo.GetCont(whereAry) |
|||
if judgeExist != nil { |
|||
overallhandle.Result(107, judgeExist, c) |
|||
return |
|||
} |
|||
saveData := overallhandle.MapOut() |
|||
saveData["time"] = time.Now().Unix() |
|||
saveData["state"] = requestData.State |
|||
|
|||
if requestData.State != 3 { |
|||
eiteErr := jobClassInfo.EiteCont(whereAry, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
if requestData.IsTrue != 1 { |
|||
//软删除
|
|||
eiteErr := jobClassInfo.EiteCont(whereAry, saveData) |
|||
if eiteErr != nil { |
|||
overallhandle.Result(106, eiteErr, c) |
|||
} else { |
|||
overallhandle.Result(0, saveData, c) |
|||
} |
|||
} else { |
|||
//硬删除
|
|||
delErr := overall.CONSTANT_DB_HR.Where(whereAry).Delete(&jobClassInfo) |
|||
if delErr == nil { |
|||
overallhandle.Result(0, saveData, c) |
|||
} else { |
|||
overallhandle.Result(108, delErr, c) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,165 @@ |
|||
package administrativeorganization |
|||
|
|||
import ( |
|||
"hr_server/models" |
|||
"hr_server/overall/overallhandle" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
type OrganizationApi struct{} |
|||
|
|||
//入口
|
|||
func (o *OrganizationApi) Index(c *gin.Context) { |
|||
outputCont := overallhandle.MapOut() |
|||
overallhandle.Result(0, outputCont, c) |
|||
} |
|||
|
|||
//名称
|
|||
type NameVal struct { |
|||
Name string `json:"name"` //名称
|
|||
} |
|||
|
|||
//职务类型翻页
|
|||
type JobClassPageSelect struct { |
|||
overallhandle.PageTurning |
|||
NameVal |
|||
} |
|||
|
|||
//修改职务类型信息
|
|||
type EiteJobClassInfo struct { |
|||
overallhandle.GetId |
|||
NameVal |
|||
overallhandle.StateOverall |
|||
} |
|||
|
|||
//状态修改及删除操作
|
|||
type EiteJobStateDel struct { |
|||
overallhandle.GetId |
|||
overallhandle.StateOverall |
|||
IsTrue int `json:"istrue"` |
|||
} |
|||
|
|||
//获取职务列表
|
|||
type dutiesListType struct { |
|||
JobClassPageSelect |
|||
JobId string `json:"jobid"` |
|||
} |
|||
|
|||
//职务输出
|
|||
type dutiesOutCont struct { |
|||
models.Duties |
|||
DutiesClassName string `json:"dutiesclassname" gorm:"column:classname;type:varchar(255) unsigned;default:'';not null;comment:职务分类名称"` |
|||
} |
|||
|
|||
//添加职务
|
|||
type addDutiesInfo struct { |
|||
NameVal |
|||
JobType string `json:"jobtype"` //归属职务类型
|
|||
Weight int64 `json:weight` //权重
|
|||
overallhandle.NmuberOverall |
|||
} |
|||
|
|||
//职务详情输出
|
|||
type getDutiesInfo struct { |
|||
dutiesOutCont |
|||
} |
|||
|
|||
//修改职务详情
|
|||
type eiteDutiesCont struct { |
|||
overallhandle.GetId |
|||
NameVal |
|||
JobType string `json:"jobtype"` //归属职务类型
|
|||
Weight int64 `json:weight` //权重
|
|||
} |
|||
|
|||
//查询名称和状态
|
|||
type selectNameOrState struct { |
|||
JobClassPageSelect |
|||
overallhandle.StateOverall |
|||
Level int `json:"level"` |
|||
} |
|||
|
|||
//添加行政类型
|
|||
type addGovClassInfo struct { |
|||
NameVal |
|||
Level int64 `json:"level"` |
|||
} |
|||
|
|||
//修改行政类型内容
|
|||
type eiteGovClassInfo struct { |
|||
overallhandle.GetId |
|||
addGovClassInfo |
|||
} |
|||
|
|||
//获取行政组织列表
|
|||
type govListType struct { |
|||
JobClassPageSelect |
|||
Number string `json:"number"` |
|||
Superior string `json:"superior"` |
|||
GovClass string `json:"govclass"` |
|||
overallhandle.StateOverall |
|||
Level int `json:"level"` |
|||
} |
|||
|
|||
//输出行政组织信息
|
|||
type outGovCont struct { |
|||
models.AdministrativeOrganization |
|||
ClassName string `json:"classname" gorm:"column:classname;type:varchar(255) unsigned;default:'';not null;comment:行政组织分类名称"` |
|||
Level int64 `json:"level" gorm:"column:level;type:int(5) unsigned;default:1;not null;comment:级别"` |
|||
} |
|||
|
|||
//添加行政组织
|
|||
type addGovInfo struct { |
|||
NameVal |
|||
Number string `json:"number"` |
|||
Superior string `json:"superior"` |
|||
GovClass string `json:"govclass"` |
|||
Abbreviation string `json:"abbreviation"` |
|||
WechatId int `json:"wechatid"` |
|||
} |
|||
|
|||
//修改行政组织
|
|||
type eiteGovInfo struct { |
|||
overallhandle.GetId |
|||
addGovInfo |
|||
} |
|||
|
|||
//添加职位(岗位)
|
|||
type addPositionInfo struct { |
|||
Number string `json:"number"` //职位编码
|
|||
NameVal //职位名称
|
|||
Duties string `json:"duties"` //职务
|
|||
Organization string `json:"organization"` //归属行政组织
|
|||
Superior string `json:"superior"` //上级
|
|||
InCharge int `json:"incharge"` //是否为本部门负责人(1:是;2:否)
|
|||
Department string `json:"department"` //部门
|
|||
} |
|||
|
|||
//编辑职位(岗位)
|
|||
type eitePositionInfo struct { |
|||
overallhandle.GetId |
|||
addPositionInfo |
|||
} |
|||
|
|||
//查看职位
|
|||
type lookPositionList struct { |
|||
JobClassPageSelect |
|||
Number string `json:"number"` //职位编码
|
|||
Duties string `json:"duties"` //职务
|
|||
Organization string `json:"organization"` //归属行政组织
|
|||
InCharge int `json:"incharge"` //是否为本部门负责人(1:是;2:否)
|
|||
Department string `json:"department"` //部门
|
|||
} |
|||
|
|||
//职务列表输出
|
|||
type positionOutInfo struct { |
|||
models.Position |
|||
DutiesName string `json:"dutiesname" gorm:"column:dutiesname;type:varchar(255) unsigned;default:'';not null;comment:职务名称"` |
|||
DutiesNumber string `json:"dutiesnumber" gorm:"column:dutiesnumber;type:varchar(255) unsigned;default:'';not null;comment:职务编号"` |
|||
AoName string `json:"aoname" gorm:"column:aoname;type:varchar(255) unsigned;default:'';not null;comment:组织名称"` |
|||
AoNumber string `json:"aonumber" gorm:"column:aonumber;type:varchar(50) unsigned;default:'';not null;comment:行政编码"` |
|||
JobName string `json:"jobname" gorm:"column:jobname;type:varchar(255) unsigned;default:'';not null;comment:职务类型"` |
|||
SuperiorName string `json:"superiorname"` //上级名称
|
|||
SuperiorNumber string `json:"superiornumber"` //上级编号
|
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
package version1 |
|||
|
|||
import "hr_server/api/version1/administrativeorganization" |
|||
|
|||
type ApiInlet struct { |
|||
OrganizationApi administrativeorganization.OrganizationApi |
|||
} |
|||
|
|||
var AppApiInlet = new(ApiInlet) |
|||
@ -0,0 +1,11 @@ |
|||
package apirouter |
|||
|
|||
import "hr_server/apirouter/organization" |
|||
|
|||
//路由入口
|
|||
|
|||
type RouterGroup struct { |
|||
OrganizationApi organization.OrganizationRoute //组织架构
|
|||
} |
|||
|
|||
var RouterGroupInlet = new(RouterGroup) |
|||
Binary file not shown.
@ -0,0 +1,47 @@ |
|||
package organization |
|||
|
|||
import ( |
|||
"hr_server/api/version1" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//组织架构
|
|||
func (o *OrganizationRoute) InitRouterGroup(route *gin.RouterGroup) { |
|||
apiRouter := route.Group("org") |
|||
var apiHandle = version1.AppApiInlet.OrganizationApi |
|||
{ |
|||
apiRouter.GET("", apiHandle.Index) //入口
|
|||
apiRouter.POST("", apiHandle.Index) //入口
|
|||
//职务分类路由
|
|||
apiRouter.POST("adddutiesclass", apiHandle.AddDutiesClass) //添加职务分类
|
|||
apiRouter.POST("utiesclasslist", apiHandle.DutiesClassList) //职务分类列表
|
|||
apiRouter.POST("getutiesclassinfo", apiHandle.GetDutiesClassInfo) //获取职务分类详情
|
|||
apiRouter.POST("eiteutiesclassinfo", apiHandle.EiteDutiesClassInfo) //修改职务分类详情
|
|||
apiRouter.POST("delutiesclassinfo", apiHandle.DelDutiesClassInfo) //删除职务分类
|
|||
//职务路由
|
|||
apiRouter.POST("dutieslist", apiHandle.DutiesList) //职务列表
|
|||
apiRouter.POST("getdutiescont", apiHandle.GetDutiesCont) //获取职务详情
|
|||
apiRouter.POST("adddutiescont", apiHandle.AddDutiesCont) //添加职务
|
|||
apiRouter.POST("eitedutiescont", apiHandle.EiteDutiesInfo) //编辑职务
|
|||
apiRouter.POST("eitedutiesstatordel", apiHandle.EiteDutiesStatOrDel) //编辑职务状态或删除
|
|||
//行政组织类型
|
|||
apiRouter.POST("govclasslist", apiHandle.GovClassList) //行政组织类型列表
|
|||
apiRouter.POST("getgovclasscont", apiHandle.GetGovClassCont) //获取行政组织类型
|
|||
apiRouter.POST("addgovclass", apiHandle.AddGovClass) //添加行政组织类型
|
|||
apiRouter.POST("eitegovclasscont", apiHandle.EiteGovClassCont) //编辑行政组织类型
|
|||
apiRouter.POST("eitegovclassstateordel", apiHandle.EiteGovClassStateOrDel) //编辑行政组织类型状态或删除
|
|||
//行政组织
|
|||
apiRouter.POST("govlist", apiHandle.GovList) //行政组织列表
|
|||
apiRouter.POST("getgovcont", apiHandle.GetGovCont) //获取行政组织
|
|||
apiRouter.POST("addgovcont", apiHandle.AddGovCont) //添加行政组织
|
|||
apiRouter.POST("eitegovcont", apiHandle.EiteGovCont) //编辑行政组织
|
|||
apiRouter.POST("eitegovstateordel", apiHandle.EiteGovStateOrDel) //编辑行政组织状态或删除
|
|||
//职位(岗位)
|
|||
apiRouter.POST("positionlist", apiHandle.PositionList) //职位(岗位)列表
|
|||
apiRouter.POST("getpositioncont", apiHandle.GetPositionCont) //获取职位(岗位)
|
|||
apiRouter.POST("addpositioncont", apiHandle.AddPositionCont) //添加职位(岗位)
|
|||
apiRouter.POST("eitepositioncont", apiHandle.EitePositionCont) //编辑职位(岗位)
|
|||
apiRouter.POST("eitepositionstateordel", apiHandle.EitePositionStateOrDel) //编辑职位(岗位)状态或删除
|
|||
} |
|||
} |
|||
@ -0,0 +1,4 @@ |
|||
package organization |
|||
|
|||
//组织架构接口
|
|||
type OrganizationRoute struct{} |
|||
@ -0,0 +1,6 @@ |
|||
|
|||
#App主配置 |
|||
appsetup: |
|||
port: 9999 #服务端口 |
|||
readtime: 3600 #请求的读取操作在超时前的最大持续时间 |
|||
writetime : 3600 #回复的写入操作在超时前的最大持续时间 |
|||
@ -0,0 +1,13 @@ |
|||
package configApp |
|||
|
|||
//服务基础配置
|
|||
type Server struct { |
|||
Appsetup appsetup `mapstructure:"appsetup" json:"appsetup" yaml:"appsetup"` |
|||
} |
|||
|
|||
//服务配置详情
|
|||
type appsetup struct { |
|||
Port int `mapstructure:"port" json:"port" yaml:"port"` |
|||
Readtime int `mapstructure:"readtime" json:"readtime" yaml:"readtime"` |
|||
Writetime int `mapstructure:"writetime" json:"writetime" yaml:"writetime"` |
|||
} |
|||
@ -0,0 +1,71 @@ |
|||
package configDatabase |
|||
|
|||
import ( |
|||
"fmt" |
|||
|
|||
"gorm.io/driver/mysql" |
|||
"gorm.io/gorm" |
|||
"gorm.io/gorm/logger" |
|||
) |
|||
|
|||
type MysqlSetUp struct { |
|||
MasterMysql MasterMysqlSetUp `mapstructure:"master" json:"master" yaml:"master"` //主数据库
|
|||
//其他数据库依次添加
|
|||
WechatMysql MasterMysqlSetUp `mapstructure:"wechat" json:"wechat" yaml:"wechat"` //微信数据库
|
|||
HrMysql MasterMysqlSetUp `mapstructure:"hrdatabase" json:"hrdatabase" yaml:"hrdatabase"` //HR数据库
|
|||
} |
|||
|
|||
type MasterMysqlSetUp struct { |
|||
UrlPath string `mapstructure:"url_path" json:"url_path" yaml:"url_path"` // 服务器地址
|
|||
Port int `mapstructure:"port" json:"port" yaml:"port"` // 端口
|
|||
Charset string `mapstructure:"charset" json:"charset" yaml:"charset"` // 编码方式
|
|||
ParseTime bool `mapstructure:"parseTime" json:"parseTime" yaml:"parseTime"` // 是否自动转换时间
|
|||
Loc string `mapstructure:"loc" json:"loc" yaml:"loc"` // 时区
|
|||
Name string `mapstructure:"name" json:"name" yaml:"name"` // 数据库名称
|
|||
UserName string `mapstructure:"username" json:"username" yaml:"username"` // 账号
|
|||
PassWord string `mapstructure:"password" json:"password" yaml:"password"` // 密码
|
|||
MaxIdleConns int `mapstructure:"max_idle_conns" json:"max_idle_conns" yaml:"max_idle_conns"` // 最大空闲数
|
|||
MaxOpenConns int `mapstructure:"max_open_conns" json:"max_open_conns" yaml:"max_open_conns"` // 最大链接数
|
|||
GormLog bool `mapstructure:"gorm_log" json:"gorm_log" yaml:"gorm_log"` // 是否开启Gorm全局日志
|
|||
} |
|||
|
|||
func (m *MasterMysqlSetUp) SqlDsn() (dsnStr string) { |
|||
dsnStr = fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v", m.UserName, m.PassWord, m.UrlPath, m.Port, m.Name, m.Charset) |
|||
if m.ParseTime == true { |
|||
dsnStr = fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v&parseTime=%v&loc=%v", m.UserName, m.PassWord, m.UrlPath, m.Port, m.Name, m.Charset, m.ParseTime, m.Loc) |
|||
} |
|||
return |
|||
} |
|||
|
|||
func (m *MasterMysqlSetUp) OpenSql() *gorm.DB { |
|||
sqlConfig := mysql.Config{ |
|||
DSN: m.SqlDsn(), // DSN
|
|||
DefaultStringSize: 255, // string 类型字段的默认长度
|
|||
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
|
|||
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
|
|||
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
|
|||
SkipInitializeWithVersion: false, // 根据版本自动配置
|
|||
} |
|||
if m.GormLog == true { |
|||
if opDb, err := gorm.Open(mysql.New(sqlConfig), &gorm.Config{ |
|||
Logger: logger.Default.LogMode(logger.Info), |
|||
}); err != nil { |
|||
return nil |
|||
} else { |
|||
sqlDb, _ := opDb.DB() |
|||
sqlDb.SetMaxIdleConns(m.MaxIdleConns) |
|||
sqlDb.SetMaxOpenConns(m.MaxOpenConns) |
|||
return opDb |
|||
} |
|||
} else { |
|||
if opDb, err := gorm.Open(mysql.New(sqlConfig)); err != nil { |
|||
return nil |
|||
} else { |
|||
sqlDb, _ := opDb.DB() |
|||
sqlDb.SetMaxIdleConns(m.MaxIdleConns) |
|||
sqlDb.SetMaxOpenConns(m.MaxOpenConns) |
|||
return opDb |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
#数据库配置 |
|||
|
|||
#主数据库 |
|||
master: |
|||
url_path: '127.0.0.1' #数据库地址 |
|||
port: 3306 #数据库端口 |
|||
charset: 'utf8mb4' #数据库编码方式 |
|||
parseTime: 'True' #是否自动转换时间 |
|||
loc: 'Local' #时区 |
|||
name: 'hengxingaoke_tes' #数据库名称 |
|||
username: 'root' #数据库用户民 |
|||
password: 'root' #数据库密码 |
|||
max_idle_conns: 100 #最大空闲数量 |
|||
max_open_conns: 1500 #最大打开数量 |
|||
gorm_log: false #是否开启gorm日志 |
|||
#微信数据库 |
|||
wechat: |
|||
url_path: '127.0.0.1' #数据库地址 |
|||
port: 3306 #数据库端口 |
|||
charset: 'utf8mb4' #数据库编码方式 |
|||
parseTime: 'True' #是否自动转换时间 |
|||
loc: 'Local' #时区 |
|||
name: 'wechatuser' #数据库名称 |
|||
username: 'root' #数据库用户民 |
|||
password: 'root' #数据库密码 |
|||
max_idle_conns: 100 #最大空闲数量 |
|||
max_open_conns: 1500 #最大打开数量 |
|||
gorm_log: false #是否开启gorm日志 |
|||
#HR数据库 |
|||
hrdatabase: |
|||
url_path: '127.0.0.1' #数据库地址 |
|||
port: 3306 #数据库端口 |
|||
charset: 'utf8mb4' #数据库编码方式 |
|||
parseTime: 'True' #是否自动转换时间 |
|||
loc: 'Local' #时区 |
|||
name: 'human_resources' #数据库名称 |
|||
username: 'root' #数据库用户民 |
|||
password: 'root' #数据库密码 |
|||
max_idle_conns: 100 #最大空闲数量 |
|||
max_open_conns: 1500 #最大打开数量 |
|||
gorm_log: true #是否开启gorm日志 |
|||
@ -0,0 +1,37 @@ |
|||
package confignosql |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
|
|||
"github.com/go-redis/redis/v8" |
|||
) |
|||
|
|||
type RedisSetUp struct { |
|||
MasterRedis RedisConfitSetUp `mapstructure:"master" json:"master" yaml:"master"` //主数据库
|
|||
MasterRedis1 RedisConfitSetUp `mapstructure:"master1" json:"master1" yaml:"master1"` //主数据库
|
|||
} |
|||
|
|||
type RedisConfitSetUp struct { |
|||
UrlPath string `mapstructure:"url_path" json:"url_path" yaml:"url_path"` // 服务器地址
|
|||
Port int `mapstructure:"port" json:"port" yaml:"port"` // 端口
|
|||
Name int `mapstructure:"name" json:"name" yaml:"name"` // 数据库名称
|
|||
PassWord string `mapstructure:"password" json:"password" yaml:"password"` // 密码
|
|||
} |
|||
|
|||
func (r *RedisConfitSetUp) OpenRedis() *redis.Client { |
|||
address := fmt.Sprintf("%v:%v", r.UrlPath, r.Port) |
|||
fmt.Printf("开启%v Redis库 %v\n", address, r.Name) |
|||
redisClient := redis.NewClient(&redis.Options{ |
|||
Addr: address, |
|||
Password: r.PassWord, |
|||
DB: r.Name, |
|||
}) |
|||
pingLink, err := redisClient.Ping(context.Background()).Result() |
|||
if err != nil { |
|||
fmt.Printf("%v Redis链接失败!原因:%v\n", r.Name, err) |
|||
} else { |
|||
fmt.Printf("%v Redis链接成功!=====>%v\n", r.Name, pingLink) |
|||
} |
|||
return redisClient |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
#Redis配置文件 |
|||
master: |
|||
url_path: '127.0.0.1' |
|||
port: 6379 #数据库端口 |
|||
password: "" |
|||
name: 0 |
|||
|
|||
#Redis配置文件 |
|||
master1: |
|||
url_path: '127.0.0.1' |
|||
port: 6379 #数据库端口 |
|||
password: "" |
|||
name: 1 |
|||
|
|||
#Redis配置文件 |
|||
master2: |
|||
url_path: '127.0.0.1' |
|||
port: 6379 #数据库端口 |
|||
password: "" |
|||
name: 2 |
|||
|
|||
#Redis配置文件 |
|||
master3: |
|||
url_path: '127.0.0.1' |
|||
port: 6379 #数据库端口 |
|||
password: "" |
|||
name: 3 |
|||
|
|||
#Redis配置文件 |
|||
master4: |
|||
url_path: '127.0.0.1' |
|||
port: 6379 #数据库端口 |
|||
password: "" |
|||
name: 4 |
|||
|
|||
#Redis配置文件 |
|||
master5: |
|||
url_path: '127.0.0.1' |
|||
port: 6379 #数据库端口 |
|||
password: "" |
|||
name: 5 |
|||
@ -0,0 +1,48 @@ |
|||
module hr_server |
|||
|
|||
go 1.18 |
|||
|
|||
require ( |
|||
github.com/fsnotify/fsnotify v1.5.1 |
|||
github.com/gin-gonic/gin v1.7.7 |
|||
github.com/go-redis/redis/v8 v8.11.5 |
|||
github.com/mozillazg/go-pinyin v0.19.0 |
|||
github.com/spf13/viper v1.10.1 |
|||
gorm.io/driver/mysql v1.3.3 |
|||
gorm.io/gorm v1.23.4 |
|||
) |
|||
|
|||
require ( |
|||
github.com/cespare/xxhash/v2 v2.1.2 // indirect |
|||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect |
|||
github.com/gin-contrib/sse v0.1.0 // 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.10.1 // indirect |
|||
github.com/go-sql-driver/mysql v1.6.0 // indirect |
|||
github.com/golang/protobuf v1.5.2 // indirect |
|||
github.com/hashicorp/hcl v1.0.0 // indirect |
|||
github.com/jinzhu/inflection v1.0.0 // indirect |
|||
github.com/jinzhu/now v1.1.4 // indirect |
|||
github.com/json-iterator/go v1.1.12 // indirect |
|||
github.com/leodido/go-urn v1.2.1 // indirect |
|||
github.com/magiconair/properties v1.8.5 // indirect |
|||
github.com/mattn/go-isatty v0.0.14 // indirect |
|||
github.com/mitchellh/mapstructure v1.4.3 // indirect |
|||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect |
|||
github.com/modern-go/reflect2 v1.0.2 // indirect |
|||
github.com/onsi/gomega v1.19.0 // indirect |
|||
github.com/pelletier/go-toml v1.9.4 // indirect |
|||
github.com/spf13/afero v1.6.0 // indirect |
|||
github.com/spf13/cast v1.4.1 // indirect |
|||
github.com/spf13/jwalterweatherman v1.1.0 // indirect |
|||
github.com/spf13/pflag v1.0.5 // indirect |
|||
github.com/subosito/gotenv v1.2.0 // indirect |
|||
github.com/ugorji/go/codec v1.2.7 // indirect |
|||
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect |
|||
golang.org/x/sys v0.0.0-20220405210540-1e041c57c461 // indirect |
|||
golang.org/x/text v0.3.7 // indirect |
|||
google.golang.org/protobuf v1.28.0 // indirect |
|||
gopkg.in/ini.v1 v1.66.2 // indirect |
|||
gopkg.in/yaml.v2 v2.4.0 // indirect |
|||
) |
|||
@ -0,0 +1,163 @@ |
|||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= |
|||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= |
|||
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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= |
|||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= |
|||
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= |
|||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= |
|||
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.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= |
|||
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= |
|||
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.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= |
|||
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.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= |
|||
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.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= |
|||
github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= |
|||
github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= |
|||
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= |
|||
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= |
|||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= |
|||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= |
|||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= |
|||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= |
|||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= |
|||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= |
|||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= |
|||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= |
|||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= |
|||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= |
|||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= |
|||
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 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= |
|||
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= |
|||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= |
|||
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/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= |
|||
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 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= |
|||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= |
|||
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.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= |
|||
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/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= |
|||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= |
|||
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/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= |
|||
github.com/mitchellh/mapstructure v1.4.3/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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= |
|||
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/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c= |
|||
github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= |
|||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= |
|||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= |
|||
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= |
|||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= |
|||
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= |
|||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= |
|||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= |
|||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= |
|||
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= |
|||
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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= |
|||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= |
|||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= |
|||
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= |
|||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= |
|||
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= |
|||
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= |
|||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= |
|||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= |
|||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= |
|||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= |
|||
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= |
|||
github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= |
|||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= |
|||
github.com/stretchr/testify v1.2.2/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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
|||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= |
|||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
|||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= |
|||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= |
|||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= |
|||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= |
|||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= |
|||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= |
|||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= |
|||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= |
|||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= |
|||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
|||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= |
|||
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o= |
|||
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= |
|||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= |
|||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= |
|||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= |
|||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= |
|||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
|||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
|||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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.0.0-20220405210540-1e041c57c461 h1:kHVeDEnfKn3T238CvrUcz6KeEsFHVaKh4kMTt6Wsysg= |
|||
golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
|||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
|||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= |
|||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= |
|||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
|||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
|||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= |
|||
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.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= |
|||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= |
|||
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-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/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= |
|||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= |
|||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= |
|||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= |
|||
gopkg.in/yaml.v2 v2.2.8/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-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= |
|||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
|||
gorm.io/driver/mysql v1.3.3 h1:jXG9ANrwBc4+bMvBcSl8zCfPBaVoPyBEBshA8dA93X8= |
|||
gorm.io/driver/mysql v1.3.3/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= |
|||
gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= |
|||
gorm.io/gorm v1.23.4 h1:1BKWM67O6CflSLcwGQR7ccfmC4ebOxQrTfOQGRE9wjg= |
|||
gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= |
|||
Binary file not shown.
@ -0,0 +1,19 @@ |
|||
package app |
|||
|
|||
import ( |
|||
"net/http" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//设置服务启动
|
|||
func InitServer(port string, handler *gin.Engine) server { |
|||
return &http.Server{ |
|||
Addr: port, //监听的TCP地址,如果为空字符串会使用":http"
|
|||
Handler: handler, //调用的处理器,如为nil会调用http.DefaultServeMux
|
|||
ReadTimeout: 3600 * time.Second, //请求的读取操作在超时前的最大持续时间
|
|||
WriteTimeout: 3600 * time.Second, //回复的写入操作在超时前的最大持续时间
|
|||
MaxHeaderBytes: 1 << 40, //请求的头域最大长度,如为0则用DefaultMaxHeaderBytes
|
|||
} |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
package app |
|||
|
|||
import ( |
|||
"fmt" |
|||
"hr_server/initialization" |
|||
"hr_server/initialization/route" |
|||
"hr_server/overall" |
|||
) |
|||
|
|||
type server interface { |
|||
ListenAndServe() error |
|||
} |
|||
|
|||
//启动服务
|
|||
func RunItem() { |
|||
//加载基础配置
|
|||
// var appConfig configApp.Server
|
|||
initialization.RunViper(&overall.CONSTANT_CONFIG) |
|||
// fmt.Printf("----------->%v", overall.CONSTANT_CONFIG)
|
|||
routers := route.InitialRouter() |
|||
portStr := fmt.Sprintf(":%d", overall.CONSTANT_CONFIG.Appsetup.Port) |
|||
startUp := InitServer(portStr, routers) |
|||
|
|||
fmt.Printf("\n\n默认API运行地址:http://127.0.0.1%s\n", portStr) |
|||
runErr := startUp.ListenAndServe().Error() |
|||
panic(fmt.Errorf(runErr)) |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
package databaseinit |
|||
|
|||
import ( |
|||
"fmt" |
|||
"hr_server/initialization" |
|||
"hr_server/overall" |
|||
) |
|||
|
|||
func LoadDatabase() { |
|||
sqlConfig := overall.CONSTANT_MYSQL |
|||
initialization.RunViper(&sqlConfig, overall.ConfigDatabaseConstant) |
|||
//开启主数据库
|
|||
overall.CONSTANT_DB_Master = sqlConfig.MasterMysql.OpenSql() |
|||
if overall.CONSTANT_DB_Master == nil { |
|||
fmt.Printf("%v数据库开启失败!\n", sqlConfig.MasterMysql.Name) |
|||
} else { |
|||
fmt.Printf("%v数据库开启成功!\n", sqlConfig.MasterMysql.Name) |
|||
} |
|||
//开启微信数据库
|
|||
overall.CONSTANT_DB_Wechat = sqlConfig.WechatMysql.OpenSql() |
|||
if overall.CONSTANT_DB_Master == nil { |
|||
fmt.Printf("%v数据库开启失败!\n", sqlConfig.WechatMysql.Name) |
|||
} else { |
|||
fmt.Printf("%v数据库开启成功!\n", sqlConfig.WechatMysql.Name) |
|||
} |
|||
//开启Hr数据库
|
|||
overall.CONSTANT_DB_HR = sqlConfig.HrMysql.OpenSql() |
|||
if overall.CONSTANT_DB_HR == nil { |
|||
fmt.Printf("%v数据库开启失败!\n", sqlConfig.HrMysql.Name) |
|||
} else { |
|||
fmt.Printf("%v数据库开启成功!\n", sqlConfig.HrMysql.Name) |
|||
} |
|||
} |
|||
@ -0,0 +1,48 @@ |
|||
package initialization |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fmt" |
|||
"hr_server/overall" |
|||
|
|||
"github.com/fsnotify/fsnotify" |
|||
"github.com/spf13/viper" |
|||
) |
|||
|
|||
//使用viper 处理包解决配置读取问题
|
|||
func RunViper(configInfo interface{}, path ...string) *viper.Viper { |
|||
var config string |
|||
if len(path) == 0 { |
|||
config = overall.ConfigFilePathConstant |
|||
fmt.Printf("你正在使用系统默认值。配置路径为:%v\n", config) |
|||
} else { |
|||
config = path[0] |
|||
fmt.Printf("你正在使用RunViper传值。配置路径为:%v\n", config) |
|||
} |
|||
v := viper.New() |
|||
// 设置配置文件信息
|
|||
v.SetConfigFile(config) |
|||
v.SetConfigType("yaml") |
|||
//读取配置信息
|
|||
err := v.ReadInConfig() |
|||
if err != nil { |
|||
panic(fmt.Errorf("配置文件读取失败?原因:%s\n", err)) |
|||
} |
|||
// 监控配置和重新获取配置
|
|||
v.WatchConfig() |
|||
|
|||
v.OnConfigChange(func(e fsnotify.Event) { |
|||
fmt.Printf("配置文件已经更改:%v\n", e.Name) |
|||
if errSet := v.Unmarshal(&configInfo); errSet != nil { |
|||
fmt.Printf("新配置文件解析失败!系统继续使用原配置!失败原因:%s\n", errSet) |
|||
} |
|||
}) |
|||
//解析配置映射到切片
|
|||
if errStruct := v.Unmarshal(&configInfo); errStruct != nil { |
|||
fmt.Printf("配置解析失败!原因:%s\n", errStruct) |
|||
} |
|||
json.Marshal(configInfo) |
|||
// cfi, _ := json.Marshal(configInfo)
|
|||
// fmt.Printf("============>%v\n", string(cfi))
|
|||
return v |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
package nosql |
|||
|
|||
import ( |
|||
"hr_server/initialization" |
|||
"hr_server/overall" |
|||
) |
|||
|
|||
//加载Redis
|
|||
func LoadRedis() { |
|||
//读取Redis配置
|
|||
redisConfig := overall.CONSTANT_Redis |
|||
initialization.RunViper(&redisConfig, overall.ConfigRedisConstant) |
|||
overall.CONSTANT_REDIS0 = redisConfig.MasterRedis.OpenRedis() |
|||
overall.CONSTANT_REDIS1 = redisConfig.MasterRedis1.OpenRedis() |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
package route |
|||
|
|||
import ( |
|||
"hr_server/apirouter" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
//初始化主路由
|
|||
func InitialRouter() *gin.Engine { |
|||
var router = gin.Default() |
|||
|
|||
// 跨域设置
|
|||
// router.Use(middleware.CrossDomainRequest()) // 如需跨域可以打开
|
|||
|
|||
//app默认相应
|
|||
appLoadRouterGroup := router.Group("") |
|||
{ |
|||
appLoadRouterGroup.GET("/", func(c *gin.Context) { |
|||
c.JSON(0, "通讯成功!") |
|||
}) |
|||
appLoadRouterGroup.POST("/test", func(c *gin.Context) { |
|||
c.JSON(0, "通讯成功!") |
|||
}) |
|||
} |
|||
//注册路由
|
|||
organizationApi := apirouter.RouterGroupInlet.OrganizationApi //组织架构
|
|||
{ |
|||
organizationApi.InitRouterGroup(appLoadRouterGroup) |
|||
} |
|||
return router |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"hr_server/initialization/app" |
|||
"hr_server/initialization/databaseinit" |
|||
"hr_server/initialization/nosql" |
|||
) |
|||
|
|||
func main() { |
|||
//加载数据库
|
|||
databaseinit.LoadDatabase() |
|||
//加载Redis
|
|||
nosql.LoadRedis() |
|||
app.RunItem() |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package middleware |
|||
|
|||
import ( |
|||
"net/http" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
// 处理跨域请求,支持options访问
|
|||
func CrossDomainRequest() gin.HandlerFunc { |
|||
return func(c *gin.Context) { |
|||
method := c.Request.Method |
|||
origin := c.Request.Header.Get("Origin") |
|||
c.Header("Access-Control-Allow-Origin", origin) |
|||
c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token,X-Token,X-User-Id") |
|||
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT") |
|||
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") |
|||
c.Header("Access-Control-Allow-Credentials", "true") |
|||
// 放行所有OPTIONS方法
|
|||
if method == "OPTIONS" { |
|||
c.AbortWithStatus(http.StatusNoContent) |
|||
} |
|||
// 处理请求
|
|||
c.Next() |
|||
} |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
package models |
|||
|
|||
import ( |
|||
"hr_server/overall" |
|||
"strings" |
|||
) |
|||
|
|||
//行政组织
|
|||
type AdministrativeOrganization struct { |
|||
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` |
|||
Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';not null;comment:行政编码"` |
|||
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"` |
|||
Superior int64 `json:"superior" gorm:"column:superior;type:bigint(20) unsigned;default:0;not null;comment:上级ID"` |
|||
OrganizationType int64 `json:"organizationtype" gorm:"column:organization_type;type:bigint(20) unsigned;default:0;not null;comment:行政组织类型"` |
|||
Abbreviation string `json:"abbreviation" gorm:"column:abbreviation;type:varchar(255) unsigned;default:'';not null;comment:行政组织简称"` |
|||
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` |
|||
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` |
|||
WechatOrganizationId int64 `json:"wechatorganizationid" gorm:"column:wechat_organization_id;type:bigint(20) unsigned;default:0;not null;comment:微信组织架构对照码"` |
|||
} |
|||
|
|||
func (AdministrativeOrganization *AdministrativeOrganization) TableName() string { |
|||
return "administrative_organization" |
|||
} |
|||
|
|||
//编辑行政组织内容
|
|||
func (cont *AdministrativeOrganization) EiteCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) { |
|||
err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error |
|||
return |
|||
} |
|||
|
|||
//获取行政组织内容
|
|||
func (cont *AdministrativeOrganization) GetCont(whereMap map[string]interface{}, field ...string) (err error) { |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&cont) |
|||
if len(field) > 0 { |
|||
fieldStr := strings.Join(field, ",") |
|||
gormDb = gormDb.Select(fieldStr) |
|||
} |
|||
gormDb = gormDb.Where(whereMap) |
|||
err = gormDb.First(&cont).Error |
|||
return |
|||
} |
|||
|
|||
//根据条件获取总数
|
|||
func (cont *AdministrativeOrganization) CountCont(whereMap map[string]interface{}) (countId int64) { |
|||
overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) |
|||
return |
|||
} |
|||
@ -0,0 +1,37 @@ |
|||
package models |
|||
|
|||
import ( |
|||
"hr_server/overall" |
|||
"strings" |
|||
) |
|||
|
|||
//行政组织类型
|
|||
type AdministrativeOrganizationType struct { |
|||
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` |
|||
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:类型名称"` |
|||
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` |
|||
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` |
|||
Level int64 `json:"level" gorm:"column:level;type:int(5) unsigned;default:1;not null;comment:级别"` |
|||
} |
|||
|
|||
func (AdministrativeOrganizationType *AdministrativeOrganizationType) TableName() string { |
|||
return "administrative_organization_type" |
|||
} |
|||
|
|||
//编辑职务分类内容
|
|||
func (cont *AdministrativeOrganizationType) EiteCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) { |
|||
err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error |
|||
return |
|||
} |
|||
|
|||
//获取详细内容
|
|||
func (cont *AdministrativeOrganizationType) GetCont(whereMap map[string]interface{}, field ...string) (err error) { |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&cont) |
|||
if len(field) > 0 { |
|||
fieldStr := strings.Join(field, ",") |
|||
gormDb = gormDb.Select(fieldStr) |
|||
} |
|||
gormDb = gormDb.Where(whereMap) |
|||
err = gormDb.First(&cont).Error |
|||
return |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
package models |
|||
|
|||
import "hr_server/overall" |
|||
|
|||
//职务
|
|||
type Duties struct { |
|||
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` |
|||
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:职务名称"` |
|||
JobType int64 `json:"jobtype" gorm:"column:job_type;type:bigint(20) unsigned;default:0;not null;comment:归属职务类型"` |
|||
Weight int64 `json:"weight" gorm:"column:weight;type:bigint(20) unsigned;default:1;not null;comment:权重"` |
|||
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` |
|||
Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';not null;comment:编码"` |
|||
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` |
|||
} |
|||
|
|||
func (Duties *Duties) TableName() string { |
|||
return "duties" |
|||
} |
|||
|
|||
//编辑职务分类内容
|
|||
func (Duties *Duties) EiteCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) { |
|||
err = overall.CONSTANT_DB_HR.Model(&Duties).Where(whereMap).Updates(saveData).Error |
|||
return |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
package models |
|||
|
|||
import "hr_server/overall" |
|||
|
|||
//职务分类
|
|||
type JobClass struct { |
|||
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` |
|||
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:职务分类名称"` |
|||
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` |
|||
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` |
|||
} |
|||
|
|||
func (JobClass *JobClass) TableName() string { |
|||
return "job_class" |
|||
} |
|||
|
|||
//编辑职务分类内容
|
|||
func (JobClass *JobClass) EiteJobClassCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) { |
|||
err = overall.CONSTANT_DB_HR.Model(&JobClass).Where(whereMap).Updates(saveData).Error |
|||
return |
|||
} |
|||
@ -0,0 +1,48 @@ |
|||
package models |
|||
|
|||
import ( |
|||
"hr_server/overall" |
|||
"strings" |
|||
) |
|||
|
|||
//职位(岗位)
|
|||
type Position struct { |
|||
Id int64 `json:"id" gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null;comment:Id;index"` |
|||
Number string `json:"number" gorm:"column:number;type:varchar(50) unsigned;default:'';not null;comment:职位编码"` |
|||
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:职位名称"` |
|||
Duties int64 `json:"duties" gorm:"column:duties;type:bigint(20) unsigned;default:0;not null;comment:职务"` |
|||
Time int64 `json:"time" gorm:"column:time;type:bigint(20) unsigned;default:0;not null;comment:创建时间"` |
|||
State int `json:"state" gorm:"column:state;type:int(1) unsigned;default:1;not null;comment:状态(1:启用;2:禁用;3:删除)"` |
|||
AdministrativeOrganization int64 `json:"administrativeorganization" gorm:"column:administrative_organization;type:bigint(20) unsigned;default:0;not null;comment:归属行政组织"` |
|||
Superior int64 `json:"superior" gorm:"column:superior;type:bigint(20) unsigned;default:0;not null;comment:上级ID"` |
|||
PersonInCharge int `json:"personincharge" gorm:"column:person_in_charge;type:int(1) unsigned;default:2;not null;comment:是否为本部门负责人(1:是;2:否)"` |
|||
Department int64 `json:"department" gorm:"column:department;type:bigint(20) unsigned;default:0;not null;comment:部门"` |
|||
} |
|||
|
|||
func (Position *Position) TableName() string { |
|||
return "position" |
|||
} |
|||
|
|||
//编辑职务分类内容
|
|||
func (cont *Position) EiteCont(whereMap map[string]interface{}, saveData map[string]interface{}) (err error) { |
|||
err = overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Updates(saveData).Error |
|||
return |
|||
} |
|||
|
|||
//获取行政组织内容
|
|||
func (cont *Position) GetCont(whereMap map[string]interface{}, field ...string) (err error) { |
|||
gormDb := overall.CONSTANT_DB_HR.Model(&cont) |
|||
if len(field) > 0 { |
|||
fieldStr := strings.Join(field, ",") |
|||
gormDb = gormDb.Select(fieldStr) |
|||
} |
|||
gormDb = gormDb.Where(whereMap) |
|||
err = gormDb.First(&cont).Error |
|||
return |
|||
} |
|||
|
|||
//根据条件获取总数
|
|||
func (cont *Position) CountCont(whereMap map[string]interface{}) (countId int64) { |
|||
overall.CONSTANT_DB_HR.Model(&cont).Where(whereMap).Count(&countId) |
|||
return |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
package overall |
|||
|
|||
import ( |
|||
"hr_server/config/configApp" |
|||
|
|||
"github.com/go-redis/redis/v8" |
|||
"gorm.io/gorm" |
|||
) |
|||
|
|||
//全局配置
|
|||
var ( |
|||
//服务常量
|
|||
CONSTANT_CONFIG configApp.Server |
|||
//
|
|||
CONSTANT_DB_Master *gorm.DB //主数据库
|
|||
CONSTANT_DB_Wechat *gorm.DB //微信数据库
|
|||
CONSTANT_DB_HR *gorm.DB //微信数据库
|
|||
//Redis
|
|||
CONSTANT_REDIS0 *redis.Client |
|||
CONSTANT_REDIS1 *redis.Client |
|||
CONSTANT_REDIS2 *redis.Client |
|||
CONSTANT_REDIS3 *redis.Client |
|||
CONSTANT_REDIS4 *redis.Client |
|||
CONSTANT_REDIS5 *redis.Client |
|||
) |
|||
@ -0,0 +1,8 @@ |
|||
package overall |
|||
|
|||
//常量
|
|||
var ( |
|||
ConfigFilePathConstant = "./config/configApp/appConfig.yaml" //服务基础配置
|
|||
ConfigDatabaseConstant = "./config/configDatabase/database.yaml" |
|||
ConfigRedisConstant = "./config/configNosql/redis.yaml" |
|||
) |
|||
@ -0,0 +1,11 @@ |
|||
package overall |
|||
|
|||
import ( |
|||
"hr_server/config/configDatabase" |
|||
confignosql "hr_server/config/configNosql" |
|||
) |
|||
|
|||
var ( |
|||
CONSTANT_MYSQL configDatabase.MysqlSetUp |
|||
CONSTANT_Redis confignosql.RedisSetUp |
|||
) |
|||
@ -0,0 +1,13 @@ |
|||
package overallhandle |
|||
|
|||
var ErrorCodeMsg = map[int]string{ |
|||
0: "成功", |
|||
100: "提交的数据格式错误!", |
|||
101: "提交的数据不能为空误!", |
|||
103: "该数据已经存在!请不要重复添加", |
|||
104: "数据写入失败!", |
|||
105: "数据查询失败!", |
|||
106: "编辑失败!", |
|||
107: "未能查询到数据!", |
|||
108: "删除失败", |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
package overallhandle |
|||
|
|||
import ( |
|||
"fmt" |
|||
"net/http" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
) |
|||
|
|||
func Result(code int, data interface{}, c *gin.Context, msgAry ...string) { |
|||
var msg string |
|||
if _, isTrue := ErrorCodeMsg[code]; isTrue { |
|||
msg = ErrorCodeMsg[code] |
|||
} |
|||
if len(msgAry) > 0 { |
|||
for _, v := range msgAry { |
|||
msg = fmt.Sprintf("%v。%v", msg, v) |
|||
} |
|||
} |
|||
c.JSON(http.StatusOK, Reply{code, msg, data}) //输出json格式数据
|
|||
} |
|||
|
|||
//列表输出标准格式
|
|||
/* |
|||
@total 总数 |
|||
@count 当前页总数 |
|||
@page 页数 |
|||
@pageSize 每页显示数量 |
|||
@data 返回数据 |
|||
*/ |
|||
func ResultList(code, page, pageSize int, total, count int64, data interface{}, c *gin.Context) (printMap map[string]interface{}) { |
|||
outMap := MapOut() |
|||
outMap["count"] = count |
|||
outMap["total"] = total |
|||
outMap["page"] = page |
|||
outMap["pageSize"] = pageSize |
|||
outMap["list"] = data |
|||
printMap = outMap |
|||
Result(code, outMap, c) |
|||
return |
|||
} |
|||
@ -0,0 +1,265 @@ |
|||
package overallhandle |
|||
|
|||
import ( |
|||
"bytes" |
|||
"fmt" |
|||
"hr_server/models" |
|||
"hr_server/overall" |
|||
"math" |
|||
"strconv" |
|||
"time" |
|||
|
|||
"github.com/mozillazg/go-pinyin" |
|||
) |
|||
|
|||
//全局函数处理
|
|||
|
|||
//初始化map
|
|||
func MapOut() (data map[string]interface{}) { |
|||
data = make(map[string]interface{}) //必可不少,分配内存
|
|||
return data |
|||
} |
|||
|
|||
func MapOutint() (data map[int]interface{}) { |
|||
data = make(map[int]interface{}) //必可不少,分配内存
|
|||
return data |
|||
} |
|||
func MapOutint64() (data map[int64]interface{}) { |
|||
data = make(map[int64]interface{}) //必可不少,分配内存
|
|||
return data |
|||
} |
|||
func MapOutFloat64() (data map[float64]interface{}) { |
|||
data = make(map[float64]interface{}) //必可不少,分配内存
|
|||
return data |
|||
} |
|||
func MapOutString() (data map[string]string) { |
|||
data = make(map[string]string) //必可不少,分配内存
|
|||
return data |
|||
} |
|||
|
|||
//时间搓转换成日期
|
|||
/* |
|||
@timestamp 待转换的时间戳 |
|||
@timeType 转换类型 |
|||
*/ |
|||
func UnixTimeToDay(timeStamp int64, timeType int) (dateStr string) { |
|||
timeTemplate := "2006-01-02 15:04:05" //常规类型
|
|||
switch timeType { |
|||
case 1: |
|||
timeTemplate = "2006/01/02 15:04:05" |
|||
case 2: |
|||
timeTemplate = "2006/01/02 15:04" |
|||
case 3: |
|||
timeTemplate = "2006/01/02 15" |
|||
case 4: |
|||
timeTemplate = "2006/01/02" |
|||
case 5: |
|||
timeTemplate = "15:04:05" |
|||
case 6: |
|||
timeTemplate = "15:04" |
|||
case 7: |
|||
timeTemplate = "15" |
|||
case 8: |
|||
timeTemplate = "04:05" |
|||
case 9: |
|||
timeTemplate = "04" |
|||
case 10: |
|||
timeTemplate = "05" |
|||
case 11: |
|||
timeTemplate = "2006-01-02 15:04:05" |
|||
case 12: |
|||
timeTemplate = "2006-01-02 15:04" |
|||
case 13: |
|||
timeTemplate = "2006-01-02 15" |
|||
case 14: |
|||
timeTemplate = "2006-01-02" |
|||
case 15: |
|||
timeTemplate = "2006-01" //年月
|
|||
case 16: |
|||
timeTemplate = "2006" //年
|
|||
case 17: |
|||
timeTemplate = "01" //月
|
|||
case 18: |
|||
timeTemplate = "02" //日
|
|||
case 19: //季度
|
|||
dayMonth := time.Unix(timeStamp, 0).Format("01") |
|||
datMonthFloat, datMonthFloatErr := strconv.ParseFloat(dayMonth, 10) |
|||
if datMonthFloatErr == nil { |
|||
dateStr = strconv.FormatFloat(math.Ceil(datMonthFloat/3), 'f', -1, 64) |
|||
} |
|||
dateStr = "1" |
|||
case 20: |
|||
timeTemplate = "20060102" |
|||
default: |
|||
timeTemplate = "2006-01-02 15:04:05" //常规类型
|
|||
} |
|||
dateStr = time.Unix(timeStamp, 0).Format(timeTemplate) |
|||
return |
|||
} |
|||
|
|||
/* |
|||
日期转时间戳 |
|||
*/ |
|||
func DateToTimeStamp(dataStr string) (timeStamp int64, isTrue bool) { |
|||
isTrue = false |
|||
tmp := "2006-01-02 15:04:05" |
|||
res, err := time.ParseInLocation(tmp, dataStr, time.Local) |
|||
timeStamp = res.Unix() |
|||
if err == nil { |
|||
isTrue = true |
|||
} |
|||
return |
|||
} |
|||
|
|||
//数据库查询翻页
|
|||
func LimitPage(page, pageSize int) (offSet int) { |
|||
if page < 1 { |
|||
page = 1 |
|||
} |
|||
offSet = pageSize * (page - 1) |
|||
if offSet < 0 { |
|||
offSet = 0 |
|||
} |
|||
return |
|||
} |
|||
|
|||
//中文首字母大写
|
|||
func ChineseFirstWordCapitalize(wordStr string) (firstWord string) { |
|||
pinYinSub := pinyin.NewArgs() |
|||
rows := pinyin.Pinyin(wordStr, pinYinSub) |
|||
for i := 0; i < len(rows); i++ { |
|||
if len(rows[i]) != 0 { |
|||
str := rows[i][0] |
|||
pi := str[0:1] |
|||
firstWord += string(bytes.ToUpper([]byte(pi))) |
|||
} |
|||
} |
|||
return |
|||
} |
|||
|
|||
//获取行政组织首字母
|
|||
/* |
|||
@govName 全称 |
|||
@abbreviation 简称 |
|||
@govClass 部门类型 |
|||
@parentId 上级 |
|||
*/ |
|||
func GetGovFirstWords(govName, abbreviation, govClass, parentId string) (firstWord string) { |
|||
var lev int = 0 |
|||
overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganizationType{}).Select("`level`").Where("`id` = ?", govClass).First(&lev) |
|||
if lev <= 2 { |
|||
if abbreviation != "" { |
|||
firstWord = ChineseFirstWordCapitalize(abbreviation) |
|||
} else { |
|||
firstWord = ChineseFirstWordCapitalize(govName) |
|||
} |
|||
} else { |
|||
var idAry []int64 |
|||
firstWord = GetCompany(GetGroupFramework(parentId, idAry)) |
|||
} |
|||
return |
|||
} |
|||
|
|||
//获取行政级别公司
|
|||
func GetCompany(id []int64) (firstWord string) { |
|||
var govClass []outGovToClass |
|||
err := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("administrative_organization.name,administrative_organization.abbreviation,aot.level").Joins("left join administrative_organization_type as aot on aot.id = administrative_organization.organization_type").Where("administrative_organization.state IN ? AND administrative_organization.id IN ?", []int{1, 2}, id).Find(&govClass).Error |
|||
if err != nil { |
|||
return |
|||
} |
|||
levelOne := "" |
|||
levelTwo := "" |
|||
for _, v := range govClass { |
|||
if v.Level == 2 { |
|||
if v.Abbreviation != "" { |
|||
levelTwo = ChineseFirstWordCapitalize(v.Abbreviation) |
|||
} else { |
|||
levelTwo = ChineseFirstWordCapitalize(v.Name) |
|||
} |
|||
firstWord = levelTwo |
|||
return |
|||
} |
|||
if v.Level == 1 { |
|||
if v.Abbreviation != "" { |
|||
levelOne = ChineseFirstWordCapitalize(v.Abbreviation) |
|||
} else { |
|||
levelOne = ChineseFirstWordCapitalize(v.Name) |
|||
} |
|||
} |
|||
} |
|||
if levelTwo != "" { |
|||
firstWord = levelTwo |
|||
} else { |
|||
firstWord = levelOne |
|||
} |
|||
return |
|||
} |
|||
|
|||
//获取架构
|
|||
func GetGroupFramework(parentId string, father []int64) []int64 { |
|||
var id int64 |
|||
err := overall.CONSTANT_DB_HR.Model(&models.AdministrativeOrganization{}).Select("`id`").Where("`superior` = ?", parentId).First(&id) |
|||
if err != nil { |
|||
return father |
|||
} |
|||
father = append(father, id) |
|||
GetGroupFramework(strconv.FormatInt(id, 10), father) |
|||
return father |
|||
} |
|||
|
|||
//
|
|||
// ZeroFillByStr
|
|||
// @Description: 字符串补零
|
|||
// @param str :需要操作的字符串
|
|||
// @param resultLen 结果字符串的长度
|
|||
// @param reverse true 为前置补零,false 为后置补零
|
|||
// @return string
|
|||
//
|
|||
func ZeroFillByStr(str string, resultLen int, reverse bool) string { |
|||
if len(str) > resultLen || resultLen <= 0 { |
|||
return str |
|||
} |
|||
if reverse { |
|||
return fmt.Sprintf("%0*s", resultLen, str) //不足前置补零
|
|||
} |
|||
result := str |
|||
for i := 0; i < resultLen-len(str); i++ { |
|||
result += "0" |
|||
} |
|||
return result |
|||
} |
|||
|
|||
//生成编号
|
|||
func CreateNumber(firstWords, govClass string) (numberStr string) { |
|||
var orgCont models.AdministrativeOrganization |
|||
var orgClass models.AdministrativeOrganizationType |
|||
|
|||
whereAry := MapOut() |
|||
whereAry["superior"] = govClass |
|||
countId := orgCont.CountCont(whereAry) |
|||
|
|||
whereOrgAry := MapOut() |
|||
whereOrgAry["id"] = govClass |
|||
orgCont.GetCont(whereOrgAry) |
|||
|
|||
orgWhere := MapOut() |
|||
orgWhere["id"] = orgCont.OrganizationType |
|||
orgClass.GetCont(orgWhere) |
|||
|
|||
// fmt.Printf("---11---------->%v------>%v\n", orgWhere, orgClass)
|
|||
|
|||
if orgClass.Level < 2 { |
|||
numberVal := ZeroFillByStr(strconv.FormatInt(countId, 10), 2, true) |
|||
numberStr = fmt.Sprintf("%v%v", firstWords, numberVal) |
|||
} else { |
|||
countId++ |
|||
numberVal := ZeroFillByStr(strconv.FormatInt(countId, 10), 2, true) |
|||
|
|||
// fmt.Printf("------------->%v------>%v\n", whereOrgAry, orgCont)
|
|||
numberStr = fmt.Sprintf("%v%v", orgCont.Number, numberVal) |
|||
} |
|||
return |
|||
} |
|||
|
|||
// //获取行政组织的部门
|
|||
// func GetOrgDepartment()
|
|||
@ -0,0 +1,37 @@ |
|||
package overallhandle |
|||
|
|||
//格式化输出
|
|||
type Reply struct { |
|||
Code int `json:"code"` |
|||
Msg string `json:"msg"` |
|||
Data interface{} `json:"data"` |
|||
} |
|||
|
|||
//取ID
|
|||
type GetId struct { |
|||
Id int64 `json:"id"` |
|||
IdStr string `json:"idstr"` |
|||
} |
|||
|
|||
//翻页格式化
|
|||
type PageTurning struct { |
|||
Page int `json:"page" form:"page"` // 页码
|
|||
PageSize int `json:"pagesize" form:"pagesize"` // 每页大小
|
|||
} |
|||
|
|||
//状态
|
|||
type StateOverall struct { |
|||
State int `json:"state"` //状态
|
|||
} |
|||
|
|||
//状态
|
|||
type NmuberOverall struct { |
|||
Number string `json:"number"` //编码
|
|||
} |
|||
|
|||
//输出行政组织关系
|
|||
type outGovToClass struct { |
|||
Name string `json:"name" gorm:"column:name;type:varchar(255) unsigned;default:'';not null;comment:组织名称"` |
|||
Abbreviation string `json:"abbreviation" gorm:"column:abbreviation;type:varchar(255) unsigned;default:'';not null;comment:行政组织简称"` |
|||
Level int64 `json:"level" gorm:"column:level;type:int(5) unsigned;default:1;not null;comment:级别"` |
|||
} |
|||
Loading…
Reference in new issue