package overallhandle import ( "bytes" "crypto/md5" "crypto/rand" "crypto/sha1" "encoding/hex" "fmt" "hr_server/models" "hr_server/overall" "math" "math/big" "strconv" "time" "github.com/mozillazg/go-pinyin" ) //全局函数处理 //编号,纯数字 func TableNumber(class ...string) (number int64) { result, _ := rand.Int(rand.Reader, big.NewInt(8999)) numberTeam := result.Int64() + 1000 numberStr := fmt.Sprintf("%v%v", time.Now().Unix(), numberTeam) if len(class) > 0 { resultLong, _ := rand.Int(rand.Reader, big.NewInt(8999999)) numberTeamLong := resultLong.Int64() + 1000000 numberStr = fmt.Sprintf("%v%v", time.Now().Unix(), numberTeamLong) } number, _ = strconv.ParseInt(numberStr, 10, 64) return } //初始化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" case 21: timeTemplate = "200601" 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 } //获取集团或第一实权部门 func GetGroupOrDepartPower(parentId int64, departId ...int64) int64 { var orgCont models.AdministrativeOrganization err := orgCont.GetCont(map[string]interface{}{"id": parentId}, "id", "organization_type", "superior", "ispower") if err != nil { return parentId } // jsonCCC, _ := json.Marshal(orgCont) // fmt.Printf("orgCont------->%v\n", string(jsonCCC)) if len(departId) > 0 { if orgCont.IsPower == 1 { // fmt.Printf("orgCont---1---->%v---->%v\n", string(jsonCCC), orgCont.Id) return orgCont.Id } return GetGroupOrDepartPower(orgCont.Superior, 1) } else { if orgCont.OrganizationType <= 2 { // fmt.Printf("orgCont---2---->%v\n", string(jsonCCC)) return orgCont.Id } return GetGroupOrDepartPower(orgCont.Superior) } // if len(departId) > 0 { // fmt.Printf("orgCont----4--->%v\n", orgCont.Superior) // GetGroupOrDepartPower(orgCont.Superior, 1) // } else { // fmt.Printf("orgCont----5--->%v\n", orgCont.Superior) // GetGroupOrDepartPower(orgCont.Superior) // } // fmt.Printf("orgCont----3--->%v\n", string(jsonCCC)) return orgCont.Id } // // 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 } type MenuList []OutGovCont //行政组织递归 func (g *MenuList) GovRecursion(parentId, level int64) []govThree { var govMap []govThree list := g.findChildren(parentId) if len(list) == 0 { return govMap } for _, v := range list { // child := g.GovRecursion(v.Superior, level+1) g.GovRecursion(v.Superior, level+1) // govMap = append(govMap, govThree{v, child}) } return govMap } //获取子集 func (g *MenuList) findChildren(parentId int64) []OutGovCont { child := []OutGovCont{} for _, v := range *g { if v.Superior == parentId { child = append(child, v) } } return child } func GovThreeList(parentId int64, govAry []OutGovCont) []govThree { var govMap []govThree for _, v := range govAry { // var zhucont govThree if v.Superior == parentId { child := GovThreeList(v.Id, govAry) govMap = append(govMap, govThree{v, child}) } } return govMap } //菜单权限递归 func MenuThreePermit(parentId int64, menuAry []models.SystemMenuOperation) []MenuPermitThree { var menuThree []MenuPermitThree for _, v := range menuAry { if v.ParentId == parentId { child := MenuThreePermit(v.Id, menuAry) menuThree = append(menuThree, MenuPermitThree{v, child}) } } return menuThree } /* *加密算法 */ type Md5Encryption struct { Code string `json:"code"` AppKey string `json:"appKey"` } func (m *Md5Encryption) Md5EncryptionAlgorithm() (md5Val string) { if m.AppKey == "" { m.Md5EncryptionInit(m.Code) } // fmt.Printf("Code ====> %v\n", m.Code) // fmt.Printf("AppKey ====> %v\n", m.AppKey) mdNew := md5.New() mdNew.Write([]byte(m.AppKey)) keyMd5 := fmt.Sprintf("%x", mdNew.Sum(nil)) codeNewMd1 := md5.New() codeNewMd1.Write([]byte(m.Code)) codeMd1 := fmt.Sprintf("%x", codeNewMd1.Sum(nil)) yiCeng := codeMd1 + keyMd5 yiCengNew := md5.New() yiCengNew.Write([]byte(yiCeng)) yiCengMd5 := fmt.Sprintf("%x", yiCengNew.Sum(nil)) erCeng := yiCengMd5 + m.AppKey erCengNew := md5.New() erCengNew.Write([]byte(erCeng)) md5Val = fmt.Sprintf("%x", erCengNew.Sum(nil)) // md5Val = codeMd1 return } //初始化程序 func (m *Md5Encryption) Md5EncryptionInit(code string) { m.AppKey = overall.CONSTANT_CONFIG.Appsetup.AppKey m.Code = code } //sha1算法 func Sha1Encryption(str string) string { sha1 := sha1.New() sha1.Write([]byte(str)) return hex.EncodeToString(sha1.Sum(nil)) } //计算当前时间N个月后的时间 /* @timeStamp 当前时间戳 @futureTime 正数多少时间后,负数多少时间前 */ func GetFutureMonthTime(timeStamp int64, futureTime, class int) (dateStr int64) { timeUnix := time.Unix(timeStamp, 0) addDate := timeUnix.AddDate(0, 0, futureTime) switch class { case 2: addDate = timeUnix.AddDate(0, futureTime, 0) case 3: addDate = timeUnix.AddDate(futureTime, 0, 0) default: addDate = timeUnix.AddDate(0, 0, futureTime) } dateStr = addDate.Unix() return } //判断字符串是否在切片中 func StringIsInMap(str string, strAry []string) bool { if len(strAry) > 0 { for _, v := range strAry { // fmt.Printf("id------>%v----->%v\n", str, strAry) if v == str { return true } } } return false } //判断值是否在数组中 func JudeInArray(id int64, ary []string) (isTrue bool) { // isTrue = false // for _, val := range ary { // valint64, err := strconv.ParseInt(val, 10, 64) // if err == nil { // if id == valint64 { // isTrue = true // } // } // } idStr := strconv.FormatInt(id, 10) isTrue = StringIsInMap(idStr, ary) return } func JudgeInMap(id int64, ary []int64) bool { if len(ary) > 0 { for _, v := range ary { if v == id { return true } } } return false }