package publicmethod
import (
"appPlatform/middleware/grocerystore"
"appPlatform/middleware/snowflake"
"appPlatform/models/modelAppPlatform"
"appPlatform/models/modelshr"
"appPlatform/models/modelsschool"
"appPlatform/models/modelsstorage"
"appPlatform/models/modelssystempermission"
"appPlatform/overall"
"bytes"
"crypto/md5"
"crypto/rand"
"crypto/sha1"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"math"
"math/big"
"reflect"
"sort"
"strconv"
"strings"
"time"
"github.com/mozillazg/go-pinyin"
"gorm.io/gorm"
)
// 全局函数处理
// 时间相关处理类
var (
timeLayoutMap = map [ string ] string {
"y" : "2006" ,
"m" : "2006-01" ,
"d" : "2006-01-02" ,
"h" : "2006-01-02 15" ,
"i" : "2006-01-02 15:04" ,
"s" : "2006-01-02 15:04:05" ,
}
weekDay = map [ string ] int {
"Monday" : 1 ,
"Tuesday" : 2 ,
"Wednesday" : 3 ,
"Thursday" : 4 ,
"Friday" : 5 ,
"Saturday" : 6 ,
"Sunday" : 7 ,
}
)
// 编号,纯数字
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
}
// 获取UUID
func GetUUid ( workId int64 ) ( uuId int64 ) {
snowflakeId , snowflakeErr := snowflake . NewWorker ( workId )
if snowflakeErr != nil {
uuId = TableNumber ( )
} else {
uuId = snowflakeId . GetId ( )
}
return
}
// 初始化map(泛型)
func MapOut [ T GenericityVariable ] ( ) ( data map [ T ] interface { } ) {
data = make ( map [ T ] interface { } ) //必可不少,分配内存
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 )
} else {
dateStr = "1"
}
dateStr = "1"
// fmt.Printf("获取是电话卡-------------->%v------------>%v------------>%v\n", dateStr, datMonthFloat, datMonthFloatErr)
case 20 :
timeTemplate = "20060102"
case 21 :
timeTemplate = "200601"
case 22 :
timeTemplate = "01-02"
case 23 : //当前日期为本月第几周
monthFirstDayStr := DateToTimeStampOld ( UnixTimeToDay ( timeStamp , 10 ) + "-01 00:00:00" ) //获取指定月第一天时间戳
dayTime := time . Unix ( monthFirstDayStr , 0 )
dayOfWeek := int ( dayTime . Weekday ( ) ) //获取本月第一天是周几
if dayOfWeek == 0 {
dayOfWeek = 7
}
dayNumber , dayNumberErr := strconv . ParseInt ( UnixTimeToDay ( timeStamp , 9 ) , 10 , 64 ) //获取今天是几号
if dayNumberErr != nil {
dayNumber = 1
}
daysAndWeeksDiff := dayNumber - ( 8 - int64 ( dayOfWeek ) )
if daysAndWeeksDiff <= 0 {
dateStr = "1"
} else {
daysAndWeeksDiffFlot , daysAndWeeksDiffFloatErr := strconv . ParseFloat ( strconv . FormatInt ( daysAndWeeksDiff , 10 ) , 10 )
if daysAndWeeksDiffFloatErr == nil {
daysWeeksDiffVal := math . Ceil ( daysAndWeeksDiffFlot / 7 ) + 1
dateStr = strconv . FormatFloat ( daysWeeksDiffVal , 'f' , - 1 , 64 )
} else {
dateStr = "1"
}
}
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 DateToTimeStampOld ( dataStr string ) ( timeStamp int64 ) {
tmp := "2006-01-02 15:04:05"
res , _ := time . ParseInLocation ( tmp , dataStr , time . Local )
timeStamp = res . Unix ( )
return
}
// 数据库查询翻页
func LimitPage ( page , pageSize int ) ( offSet int ) {
if page < 1 {
page = 1
}
offSet = pageSize * ( page - 1 )
if offSet < 0 {
offSet = 0
}
return
}
// 数据库查询翻页
func LimitPage64 ( page , pageSize int64 ) ( offSet int64 ) {
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
}
// 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
}
/ *
* 加密算法
* /
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 ) )
// fmt.Printf("Step1:--AppKey-加密->%v\n", keyMd5)
codeNewMd1 := md5 . New ( )
codeNewMd1 . Write ( [ ] byte ( m . Code ) )
codeMd1 := fmt . Sprintf ( "%x" , codeNewMd1 . Sum ( nil ) )
// fmt.Printf("Step2:--CodeString-加密->%v\n", codeMd1)
yiCeng := codeMd1 + keyMd5
// fmt.Printf("Step3:--CodeString+AppKey-->%v\n", yiCeng)
yiCengNew := md5 . New ( )
yiCengNew . Write ( [ ] byte ( yiCeng ) )
yiCengMd5 := fmt . Sprintf ( "%x" , yiCengNew . Sum ( nil ) )
// fmt.Printf("Step4:--one-加密->%v\n", yiCengMd5)
erCeng := yiCengMd5 + m . AppKey
// fmt.Printf("Step5:--one + AppKey->%v\n", erCeng)
// fmt.Printf("AppKey ===2=> %v\n", m.AppKey)
erCengNew := md5 . New ( )
erCengNew . Write ( [ ] byte ( erCeng ) )
md5Val = fmt . Sprintf ( "%x" , erCengNew . Sum ( nil ) )
// fmt.Printf("Step6:--therr--加密-->%v\n", md5Val)
// md5Val = codeMd1
return
}
func ( m * Md5Encryption ) Md5EncryptionAlgorithmFj ( ) ( md5Val string , outlog [ ] string ) {
if m . AppKey == "" {
m . Md5EncryptionInit ( m . Code )
}
// fmt.Printf("Code ====> %v\n", m.Code)
// fmt.Printf("AppKey ====> %v\n", m.AppKey)
outlog = append ( outlog , fmt . Sprintf ( "Code ====> %v" , m . Code ) )
outlog = append ( outlog , fmt . Sprintf ( "AppKey ====> %v" , m . AppKey ) )
mdNew := md5 . New ( )
mdNew . Write ( [ ] byte ( m . AppKey ) )
keyMd5 := fmt . Sprintf ( "%x" , mdNew . Sum ( nil ) )
// fmt.Printf("Step1:--AppKey-加密->%v\n", keyMd5)
outlog = append ( outlog , fmt . Sprintf ( "Step1:--AppKey-加密->%v" , keyMd5 ) )
codeNewMd1 := md5 . New ( )
codeNewMd1 . Write ( [ ] byte ( m . Code ) )
codeMd1 := fmt . Sprintf ( "%x" , codeNewMd1 . Sum ( nil ) )
// fmt.Printf("Step2:--CodeString-加密->%v\n", codeMd1)
outlog = append ( outlog , fmt . Sprintf ( "Step2:--CodeString-加密->%v" , codeMd1 ) )
yiCeng := codeMd1 + keyMd5
// fmt.Printf("Step3:--CodeString+AppKey-->%v\n", yiCeng)
outlog = append ( outlog , fmt . Sprintf ( "Step3:--CodeString+AppKey-->%v" , yiCeng ) )
yiCengNew := md5 . New ( )
yiCengNew . Write ( [ ] byte ( yiCeng ) )
yiCengMd5 := fmt . Sprintf ( "%x" , yiCengNew . Sum ( nil ) )
// fmt.Printf("Step4:--one-加密->%v\n", yiCengMd5)
outlog = append ( outlog , fmt . Sprintf ( "Step4:--one-加密->%v" , yiCengMd5 ) )
erCeng := yiCengMd5 + m . AppKey
// fmt.Printf("Step5:--one + AppKey->%v\n", erCeng)
outlog = append ( outlog , fmt . Sprintf ( "Step5:--one + AppKey->%v" , erCeng ) )
// fmt.Printf("AppKey ===2=> %v\n", m.AppKey)
erCengNew := md5 . New ( )
erCengNew . Write ( [ ] byte ( erCeng ) )
md5Val = fmt . Sprintf ( "%x" , erCengNew . Sum ( nil ) )
// fmt.Printf("Step6:--therr--加密-->%v\n", md5Val)
outlog = append ( outlog , fmt . Sprintf ( "Step6:--therr--加密-->%v" , md5Val ) )
// 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 IsInTrue [ T GenericityVariable ] ( key T , keyAry [ ] T ) ( isTrue bool ) {
isTrue = false
for _ , v := range keyAry {
if v == key {
return true
}
}
return
}
// 获取两个切片得差集
func DifferenceSet [ T GenericityVariable ] ( one , two [ ] T ) [ ] T {
var three [ ] T
temp := map [ T ] struct { } { }
for _ , val := range two {
if _ , ok := temp [ val ] ; ! ok {
temp [ val ] = struct { } { }
}
}
for _ , val := range one {
if _ , ok := temp [ val ] ; ! ok {
three = append ( three , val )
}
}
return three
}
// 两个切片的交集
func Intersect [ T GenericityVariable ] ( a , b [ ] T ) [ ] T {
inter := make ( [ ] T , 0 )
mp := make ( map [ T ] bool )
for _ , s := range a {
if _ , ok := mp [ s ] ; ! ok {
mp [ s ] = true
}
}
for _ , s := range b {
if _ , ok := mp [ s ] ; ok {
inter = append ( inter , s )
}
}
return inter
}
//判断类型转换成
/ *
字符转int
* /
func StringToInt ( val interface { } ) ( int , error ) {
switch val . ( type ) {
case string :
return strconv . Atoi ( val . ( string ) )
case int :
return val . ( int ) , nil
default :
return 0 , nil
}
return 0 , nil
}
/ *
字符转int64
* /
func StringToInt64 ( val interface { } ) ( int64 , error ) {
switch val . ( type ) {
case string :
return strconv . ParseInt ( val . ( string ) , 10 , 64 )
case int :
return int64 ( val . ( int ) ) , nil
case int64 :
return val . ( int64 ) , nil
default :
return 0 , nil
}
return 0 , nil
}
// 获取人员TokenRedis 信息
func GetUserRedisToken ( number string ) ( manCont modelshr . ManCont , err error ) {
redisMyContKey := fmt . Sprintf ( "ScanCode:Authentication:UserCont_%v_%v" , overall . CONSTANT_CONFIG . RedisPrefixStr . Alias , number )
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS5 )
useMap , isTrue := redisClient . HashGetAll ( redisMyContKey )
if isTrue == false {
err . Error ( )
return
}
// fmt.Printf("%v\n", useMap)
err = MapToStruct ( useMap , & manCont , "json" )
return
}
// 获取人员Redis信息
func GetUserRedisCont ( number string ) ( manCont modelshr . ManCont , err error ) {
redisMyContKey := fmt . Sprintf ( "ScanCode:Authentication:UserCont_%v_%v" , overall . CONSTANT_CONFIG . RedisPrefixStr . Alias , number )
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS5 )
useMap , isTrue := redisClient . HashGetAll ( redisMyContKey )
if isTrue == false {
err . Error ( )
return
}
// fmt.Printf("%v\n", useMap)
// var manInfo models.ManCont
err = MapToStruct ( useMap , & manCont , "json" )
// manCont = manInfo
return
}
// 获取人员Redis信息返回指针
func GetUserRedisContPointer ( number string ) ( manCont modelshr . ManCont , err error ) {
redisMyContKey := fmt . Sprintf ( "ScanCode:Authentication:UserCont_%v_%v" , overall . CONSTANT_CONFIG . RedisPrefixStr . Alias , number )
// fmt.Printf("redisMyContKey------------>%v\n", redisMyContKey)
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS5 )
useMap , isTrue := redisClient . HashGetAll ( redisMyContKey )
if isTrue == false {
err . Error ( )
return
}
// fmt.Printf("%v\n", useMap)
// var manInfo models.ManCont
err = MapToStruct ( useMap , & manCont , "json" )
// manCont = manInfo
return
}
/ *
map [ string ] string 转 struct
* /
func MapToStruct ( mapString map [ string ] string , structInterface interface { } , tag string ) ( err error ) {
strType := reflect . TypeOf ( structInterface )
strValue := reflect . ValueOf ( structInterface )
switch strType . Kind ( ) {
case reflect . Ptr :
if strType . Elem ( ) . Kind ( ) != reflect . Struct {
// fmt.Printf("1-->%v\n", strType.Elem().Kind().String())
return errors . New ( "需要*struct类型,却传入*" + strType . Elem ( ) . Kind ( ) . String ( ) + "类型" )
}
default :
// fmt.Printf("2-->%v\n", strType.Kind().String())
return errors . New ( "需要*struct类型,却传入" + strType . Kind ( ) . String ( ) + "类型" )
}
// fmt.Printf("strType--->%v---strValue---->%v\n", strType, strValue)
strTypeElem := strType . Elem ( )
strValueElem := strValue . Elem ( )
strTypeNum := strTypeElem . NumField ( )
// fmt.Printf("strTypeElem--->%v---strValueElem---->%v---------strTypeNum--------->%v\n", strTypeElem, strValueElem, strTypeNum)
for i := 0 ; i < strTypeNum ; i ++ {
fieldName := strTypeElem . Field ( i ) . Name
if tag != "" {
fieldName = strTypeElem . Field ( i ) . Tag . Get ( tag )
}
value , ok := mapString [ fieldName ]
if ! ok {
continue
}
// fmt.Printf("name--->%v---tag---->%v----value---->%v----ok---->%v\n", fieldName, tag, value, ok)
if strValueElem . Field ( i ) . CanSet ( ) {
// fmt.Printf("Type--->%v---value---->%v\n", strValueElem.Field(i).Type(), reflect.TypeOf(value))
valType := fmt . Sprintf ( "%v" , strValueElem . Field ( i ) . Type ( ) )
switch valType {
case "int" :
valueInt , _ := strconv . Atoi ( value )
strValueElem . Field ( i ) . Set ( reflect . ValueOf ( valueInt ) )
case "int32" :
valueInt32 , _ := strconv . ParseInt ( value , 10 , 32 )
strValueElem . Field ( i ) . Set ( reflect . ValueOf ( int32 ( valueInt32 ) ) )
case "int64" :
valueInt64 , _ := strconv . ParseInt ( value , 10 , 64 )
strValueElem . Field ( i ) . Set ( reflect . ValueOf ( valueInt64 ) )
case "float32" :
valuefloat32 , _ := strconv . ParseFloat ( value , 32 )
strValueElem . Field ( i ) . Set ( reflect . ValueOf ( float32 ( valuefloat32 ) ) )
case "float64" :
valuefloat64 , _ := strconv . ParseFloat ( value , 64 )
strValueElem . Field ( i ) . Set ( reflect . ValueOf ( valuefloat64 ) )
case "string" :
strValueElem . Field ( i ) . Set ( reflect . ValueOf ( value ) )
default :
}
} else {
continue
}
}
return
}
// 翻页设置
func PageTurningSettings ( gormDb * gorm . DB , page , pageSize int ) * gorm . DB {
if page < 0 {
page = 1
}
if pageSize < 0 {
pageSize = 10
}
gormDb = gormDb . Limit ( pageSize ) . Offset ( LimitPage ( page , pageSize ) )
return gormDb
}
//浮点数保留小数
/ *
@ value 浮点数值
@ weishu 要保留的小数位数
* /
func DecimalEs ( value float64 , weishu int ) float64 {
switch weishu {
case 3 :
value , _ = strconv . ParseFloat ( fmt . Sprintf ( "%.3f" , value ) , 64 )
case 4 :
value , _ = strconv . ParseFloat ( fmt . Sprintf ( "%.4f" , value ) , 64 )
case 5 :
value , _ = strconv . ParseFloat ( fmt . Sprintf ( "%.5f" , value ) , 64 )
case 6 :
value , _ = strconv . ParseFloat ( fmt . Sprintf ( "%.6f" , value ) , 64 )
default :
value , _ = strconv . ParseFloat ( fmt . Sprintf ( "%.2f" , value ) , 64 )
}
return value
}
// 递归查找
func RecursionOrgLeve ( superior int64 , leve int64 ) ( groupId int64 ) {
if leve == 0 {
leve = 1
}
if superior == 0 {
return
}
var orgMap modelshr . OrgContType
err := orgMap . GetCont ( map [ string ] interface { } { "`id`" : superior , "`state`" : 1 } , "`id`" , "`superior`" , "`level`" )
if err != nil {
return
}
if orgMap . Level <= leve {
groupId = orgMap . Id
return
} else {
groupId = RecursionOrgLeve ( orgMap . Superior , leve )
}
return
}
// 获取集团、公司、部门、二级部门、工段
func GetOrgStructurees ( orgId int64 ) ( groupId , companyId , departmentId , sunDepartId , workShopId int64 ) {
if orgId == 0 {
return
}
var orgContTypeInfo modelshr . OrgContType
err := orgContTypeInfo . GetCont ( map [ string ] interface { } { "`id`" : orgId } )
if err != nil {
return
}
switch orgContTypeInfo . Level {
case 1 :
groupId = orgContTypeInfo . Id
case 2 :
groupId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 1 )
workShopId = orgContTypeInfo . Id
case 3 :
groupId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 2 )
companyId = orgContTypeInfo . Id
case 4 :
groupId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 2 )
companyId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 3 )
departmentId = orgContTypeInfo . Id
case 5 :
groupId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 2 )
companyId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 3 )
departmentId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 4 )
sunDepartId = orgContTypeInfo . Id
case 6 :
groupId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 2 )
companyId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 3 )
departmentId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 4 )
sunDepartId = RecursionOrgLevees ( orgId , orgContTypeInfo . Superior , 5 )
workShopId = orgContTypeInfo . Id
default :
groupId = orgContTypeInfo . Id
companyId = orgContTypeInfo . Id
workShopId = orgContTypeInfo . Id
}
return
}
func RecursionOrgLevees ( oldId , superior int64 , leve int64 ) ( groupId int64 ) {
if leve == 0 {
leve = 1
}
if superior == 0 {
return
}
var orgMap modelshr . OrgContType
err := orgMap . GetCont ( map [ string ] interface { } { "`id`" : superior , "`state`" : 1 } , "`id`" , "`superior`" , "`level`" )
if err != nil {
return
}
if orgMap . Level <= leve {
if orgMap . Level == leve {
groupId = oldId
} else {
groupId = orgMap . Id
}
return
} else {
groupId = RecursionOrgLevees ( orgMap . Id , orgMap . Superior , leve )
}
return
}
// 获取集团、公司、部门、二级部门、工段
func GetOrgStructure ( orgId int64 ) ( groupId , companyId , departmentId , sunDepartId , workShopId int64 ) {
if orgId == 0 {
return
}
var orgContTypeInfo modelshr . OrgContType
err := orgContTypeInfo . GetCont ( map [ string ] interface { } { "`id`" : orgId } )
if err != nil {
return
}
switch orgContTypeInfo . Level {
case 1 :
groupId = orgContTypeInfo . Id
case 2 :
groupId = RecursionOrgLeve ( orgContTypeInfo . Superior , 1 )
workShopId = orgContTypeInfo . Id
case 3 :
groupId = RecursionOrgLeve ( orgContTypeInfo . Superior , 2 )
companyId = orgContTypeInfo . Id
case 4 :
groupId = RecursionOrgLeve ( orgContTypeInfo . Superior , 2 )
companyId = RecursionOrgLeve ( orgContTypeInfo . Superior , 3 )
departmentId = orgContTypeInfo . Id
case 5 :
groupId = RecursionOrgLeve ( orgContTypeInfo . Superior , 2 )
companyId = RecursionOrgLeve ( orgContTypeInfo . Superior , 3 )
departmentId = RecursionOrgLeve ( orgContTypeInfo . Superior , 4 )
sunDepartId = orgContTypeInfo . Id
case 6 :
groupId = RecursionOrgLeve ( orgContTypeInfo . Superior , 2 )
companyId = RecursionOrgLeve ( orgContTypeInfo . Superior , 3 )
departmentId = RecursionOrgLeve ( orgContTypeInfo . Superior , 4 )
sunDepartId = RecursionOrgLeve ( orgContTypeInfo . Superior , 5 )
workShopId = orgContTypeInfo . Id
default :
groupId = orgContTypeInfo . Id
companyId = orgContTypeInfo . Id
workShopId = orgContTypeInfo . Id
}
return
}
// 获取指定行政组织id,所有子类
func GetDepartmentSun ( superior int64 , idary [ ] int64 ) ( orgIdAry [ ] int64 ) {
var orgAry [ ] modelshr . AdministrativeOrganization
err := overall . CONSTANT_DB_HR . Model ( & modelshr . AdministrativeOrganization { } ) . Select ( "`id`" ) . Where ( "`state` = 1 AND `superior` = ?" , superior ) . Find ( & orgAry ) . Error
if err != nil {
return
}
for _ , v := range orgAry {
if IsInTrue [ int64 ] ( v . Id , orgIdAry ) == false {
orgIdAry = append ( orgIdAry , v . Id )
GetDepartmentSun ( v . Id , orgIdAry )
} else {
GetDepartmentSun ( v . Id , orgIdAry )
}
}
return
}
// 获取集团或第一实权部门
func GetGroupOrDepartPower ( parentId int64 , departId ... int64 ) int64 {
var orgCont modelshr . AdministrativeOrganization
err := orgCont . GetCont ( map [ string ] interface { } { "id" : parentId } , "id" , "organization_type" , "superior" , "ispower" )
if err != nil {
return parentId
}
if len ( departId ) > 0 {
if orgCont . IsPower == 1 {
return orgCont . Id
}
return GetGroupOrDepartPower ( orgCont . Superior , 1 )
} else {
if orgCont . OrganizationType <= 2 {
return orgCont . Id
}
return GetGroupOrDepartPower ( orgCont . Superior )
}
return orgCont . Id
}
// 时间计算(年、季、月、周、日、时、分、秒)
func ComputingTime ( timeStamp int64 , timeType int ) ( timeDataInt int64 ) {
var timeData string = "1"
switch timeType {
case 1 :
timeData = time . Unix ( timeStamp , 0 ) . Format ( "2006" ) //年
case 2 :
dayMonth := time . Unix ( timeStamp , 0 ) . Format ( "01" ) //季度
datMonthFloat , datMonthFloatErr := strconv . ParseFloat ( dayMonth , 10 )
if datMonthFloatErr == nil {
timeData = strconv . FormatFloat ( math . Ceil ( datMonthFloat / 3 ) , 'f' , - 1 , 64 )
} else {
timeData = "1"
}
case 3 :
timeData = time . Unix ( timeStamp , 0 ) . Format ( "01" ) //月份
case 4 : //当前日期为本月第几周
monthFirstDayStr := DateToTimeStampOld ( UnixTimeToDay ( timeStamp , 15 ) + "-01 00:00:00" ) //获取指定月第一天时间戳
dayTime := time . Unix ( monthFirstDayStr , 0 )
dayOfWeek := int ( dayTime . Weekday ( ) ) //获取本月第一天是周几
if dayOfWeek == 0 {
dayOfWeek = 7
}
dayNumber , dayNumberErr := strconv . ParseInt ( UnixTimeToDay ( timeStamp , 18 ) , 10 , 64 ) //获取今天是几号
if dayNumberErr != nil {
dayNumber = 1
}
daysAndWeeksDiff := dayNumber - ( 8 - int64 ( dayOfWeek ) )
if daysAndWeeksDiff <= 0 {
timeData = "1"
} else {
daysAndWeeksDiffFlot , daysAndWeeksDiffFloatErr := strconv . ParseFloat ( strconv . FormatInt ( daysAndWeeksDiff , 10 ) , 10 )
if daysAndWeeksDiffFloatErr == nil {
daysWeeksDiffVal := math . Ceil ( daysAndWeeksDiffFlot / 7 ) + 1
timeData = strconv . FormatFloat ( daysWeeksDiffVal , 'f' , - 1 , 64 )
} else {
timeData = "1"
}
}
case 5 :
timeData = time . Unix ( timeStamp , 0 ) . Format ( "02" ) //天
case 7 :
timeData = time . Unix ( timeStamp , 0 ) . Format ( "15" ) //时
case 8 :
timeData = time . Unix ( timeStamp , 0 ) . Format ( "04" ) //分
case 9 :
timeData = time . Unix ( timeStamp , 0 ) . Format ( "05" ) //秒
default :
timeData = "0"
}
timeDataInt , timeDataIntErr := strconv . ParseInt ( timeData , 10 , 64 )
if timeDataIntErr != nil {
timeDataInt = 0
return
}
return
}
/ *
获取岗位权限
@ ordid 行政组织
@ postid 岗位
@ system 系统标识
* /
func GetPostPower ( ordid , postid int64 , system string ) ( menuIdAry , menuUrl [ ] string , err error ) {
redisFileEmpowerKey := fmt . Sprintf ( "ScanCode:SystemEmpower:Authorize_%v_%v_%v" , overall . CONSTANT_CONFIG . RedisPrefixStr . Alias , system , postid )
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS5 )
empowerRedisToken , isTrue := redisClient . HashGetAll ( redisFileEmpowerKey )
// fmt.Printf("empowerRedisToken------------->%v---------->isTrue------------->%v---------->redisFileEmpowerKey------------->%v\n", empowerRedisToken, isTrue, redisFileEmpowerKey)
if isTrue == false {
fmt . Printf ( "GetPostPower-1-->%v\n" , empowerRedisToken [ "menuid" ] )
menuIdAry , menuUrl , err = readMenuList ( postid , system )
writeRedisData := MapOut [ string ] ( )
writeRedisData [ "menuid" ] = strings . Join ( menuIdAry , "," )
writeRedisData [ "menuurl" ] = strings . Join ( menuUrl , "|_^_|" )
redisClient . SetRedisTime ( 10800 )
redisClient . HashMsetAdd ( redisFileEmpowerKey , writeRedisData )
} else {
// fmt.Printf("GetPostPower-2-->%v\n", empowerRedisToken["menuid"])
menuIdAry = strings . Split ( empowerRedisToken [ "menuid" ] , "," )
menuUrl = strings . Split ( empowerRedisToken [ "menuurl" ] , "|_^_|" )
// fmt.Printf("GetPostPower-3-->%v-->%v\n", len(menuIdAry), menuIdAry)
if len ( menuIdAry ) <= 1 {
menuIdAry , menuUrl , err = readMenuList ( postid , system )
writeRedisData := MapOut [ string ] ( )
writeRedisData [ "menuid" ] = strings . Join ( menuIdAry , "," )
writeRedisData [ "menuurl" ] = strings . Join ( menuUrl , "|_^_|" )
redisClient . SetRedisTime ( 10800 )
redisClient . HashMsetAdd ( redisFileEmpowerKey , writeRedisData )
}
}
return
}
/ *
读取菜单
* /
func readMenuList ( postid int64 , system string ) ( menuIdAry , menuUrl [ ] string , err error ) {
var ponitId string
err = overall . CONSTANT_DB_System_Permission . Model ( & modelssystempermission . Empower { } ) . Select ( "`point_id`" ) . Where ( "`state` = 1 AND `post_id` = ? AND `system` = ?" , postid , system ) . Find ( & ponitId ) . Error
if err != nil {
return
}
menuIdAry = strings . Split ( ponitId , "," )
if len ( menuIdAry ) < 1 {
return
}
switch system {
case "cangchu" :
menuUrl , err = getStorageSystemEmpower ( menuIdAry )
default :
//绩效考核系统
menuUrl , err = getKpiSystemEmpower ( menuIdAry )
}
return
}
/ *
获取绩效考核系统授权菜单
@ menuIdAry 菜单ID
* /
func getKpiSystemEmpower ( menuIdAry [ ] string ) ( menuUrl [ ] string , err error ) {
if len ( menuIdAry ) < 1 {
return
}
var empowerMenuUrl [ ] string
err = overall . CONSTANT_DB_Master . Model ( & modelsschool . SystemMenuSchool { } ) . Distinct ( "`m_url`" ) . Where ( "`m_steat` = 1 AND `m_id` IN ?" , menuIdAry ) . Find ( & empowerMenuUrl ) . Error
if err != nil || len ( empowerMenuUrl ) < 1 {
return
}
for i := 0 ; i < len ( empowerMenuUrl ) ; i ++ {
if empowerMenuUrl [ i ] != "#" && IsInTrue [ string ] ( empowerMenuUrl [ i ] , menuUrl ) == false {
menuUrl = append ( menuUrl , empowerMenuUrl [ i ] )
}
}
return
}
/ *
获取仓储考核系统授权菜单
@ menuIdAry 菜单ID
* /
func getStorageSystemEmpower ( menuIdAry [ ] string ) ( menuUrl [ ] string , err error ) {
if len ( menuIdAry ) < 1 {
return
}
var empowerMenuUrl [ ] string
err = overall . CONSTANT_DB_Storage . Model ( & modelsstorage . AccesstoAddress { } ) . Distinct ( "`url`" ) . Where ( "`state` = 1 AND `id` IN ?" , menuIdAry ) . Find ( & empowerMenuUrl ) . Error
if err != nil || len ( empowerMenuUrl ) < 1 {
return
}
// fmt.Printf("empowerMenuUrl---------->%v\n", empowerMenuUrl)
for i := 0 ; i < len ( empowerMenuUrl ) ; i ++ {
if empowerMenuUrl [ i ] != "#" && empowerMenuUrl [ i ] != "" && IsInTrue [ string ] ( empowerMenuUrl [ i ] , menuUrl ) == false {
menuUrl = append ( menuUrl , empowerMenuUrl [ i ] )
}
}
return
}
// 获取公司最小主责部门
func GetMinMainDutyDeparment ( company string ) ( organization [ ] modelshr . AdministrativeOrganization ) {
var allOrg [ ] modelshr . AdministrativeOrganization
err := overall . CONSTANT_DB_HR . Model ( & modelshr . AdministrativeOrganization { } ) . Where ( "ispower = 1 AND state = 1 AND organization_type > 2 AND superior = ?" , company ) . Find ( & allOrg ) . Error
if err != nil || len ( allOrg ) < 1 {
return
}
for _ , v := range allOrg {
sunOrgList , orgSunErr := GetSunOrgList ( v . Id )
if orgSunErr == nil && len ( sunOrgList ) > 0 {
for _ , sv := range sunOrgList {
organization = append ( organization , sv )
}
} else {
organization = append ( organization , v )
}
}
return
}
// 获取下级行政组织是否有主行政部门
func GetSunOrgList ( orgId int64 ) ( orgList [ ] modelshr . AdministrativeOrganization , ovErr error ) {
ovErr = overall . CONSTANT_DB_HR . Where ( "state = 1" ) . Where ( "ispower = 1 AND superior = ?" , orgId ) . Find ( & orgList ) . Error
return
}
// 递归无限极菜单树
func GetMenuThree ( jurisd int , parentId string , threeData [ ] MenuContList ) [ ] PowerThree {
treeList := [ ] PowerThree { }
for _ , v := range threeData {
if v . ParentId == parentId {
child := GetMenuThree ( jurisd , v . Id , threeData )
var node PowerThree
node . Id = v . Id
node . Name = v . Name
node . ParentId = v . ParentId
node . IsTrue = v . IsTrue
isTrue , menuOper := MenuOperation ( jurisd , v . Id )
if isTrue == true {
node . MenuOperation = menuOper
// fmt.Printf("GetMenuThree-1111--%v--->%v\n", v.Id, menuOper)
}
node . Child = child
treeList = append ( treeList , node )
}
}
return treeList
}
// 获取菜单操作项目
func MenuOperation ( jurisd int , menuId string ) ( isTrue bool , operation [ ] MenuContList ) {
var operList [ ] modelsschool . MenuOperation
isTrue = false
operErr := overall . CONSTANT_DB_Master . Where ( "`menu_id` = ?" , menuId ) . Order ( "oper_id desc" ) . Find ( & operList ) . Error
if operErr != nil || len ( operList ) < 1 {
return
}
isTrue = true
for i := 0 ; i < len ( operList ) ; i ++ {
var menSmaiCont MenuContList
menSmaiCont . Id = strconv . FormatInt ( operList [ i ] . OperId , 10 )
menSmaiCont . Name = operList [ i ] . OperTitle
menSmaiCont . ParentId = strconv . FormatInt ( operList [ i ] . MenuId , 10 )
operation = append ( operation , menSmaiCont )
}
// fmt.Printf("ApiUrl---%v--->%v--->%v--->%v\n", menuId, isTrue, operErr, operList)
return
}
/ *
递归无限极菜单树
* /
func GetMenuThrees ( jurisd int , parentId string , threeData [ ] MenuContList ) [ ] PowerThree {
treeList := [ ] PowerThree { }
for _ , v := range threeData {
if v . ParentId == parentId {
child := GetMenuThrees ( jurisd , v . Id , threeData )
var node PowerThree
node . Id = v . Id
node . Name = v . Name
node . ParentId = v . ParentId
node . Child = child
node . IsTrue = v . IsTrue
// fmt.Printf("GetMenuThree-22222--%v--->%v\n", v.Id, node)
treeList = append ( treeList , node )
}
}
return treeList
}
// 获取责任人
func GetDepartmentLeader ( userCont modelshr . PersonArchives ) {
var orgContList [ ] DepartmentIsPower
orgContList = GetAllFatherDeparment ( userCont . AdminOrg , 1 , orgContList )
//根据序号排序
sort . Slice ( orgContList , func ( i , j int ) bool {
return orgContList [ i ] . Sort < orgContList [ j ] . Sort
} )
jsonStr , _ := json . Marshal ( orgContList )
fmt . Printf ( "orgList---------------->%v\n" , string ( jsonStr ) )
}
// 获取行政组织的所有上级实权部门
func GetAllFatherDeparment ( orgId int64 , sort int , oldCont [ ] DepartmentIsPower ) ( orgContList [ ] DepartmentIsPower ) {
var orgCont modelshr . AdministrativeOrganization
err := orgCont . GetCont ( map [ string ] interface { } { "id" : orgId } , "id" , "name" , "organization_type" , "superior" , "ispower" )
if err != nil {
return
}
if orgCont . OrganizationType <= 2 {
orgContList = oldCont
// jsonStr, _ := json.Marshal(oldCont)
// fmt.Printf("oldCont---------------->%v\n", string(jsonStr))
return
} else {
// jsonStr, _ := json.Marshal(oldCont)
// fmt.Printf("oldCont---------------->%v\n", string(jsonStr))
if orgCont . IsPower == 1 {
var orgListCont DepartmentIsPower
orgListCont . Id = strconv . FormatInt ( orgCont . Id , 10 )
orgListCont . Name = orgCont . Name
orgListCont . Superior = orgCont . Superior
orgListCont . OrganizationType = orgCont . OrganizationType
orgListCont . IsPower = orgCont . IsPower
orgListCont . Sort = sort
orgListCont . PowerPeople = GetDutyOrgAbourLeader ( orgCont . Id )
oldCont = append ( oldCont , orgListCont )
orgContList = oldCont
sort = sort + 1
}
return GetAllFatherDeparment ( orgCont . Superior , sort , oldCont )
}
return orgContList
}
/ *
获取主权行政组织责任岗位及相关人员
@ ordId 行政组织ID
* /
func GetDutyOrgAbourLeader ( ordId int64 ) ( postAboutPeople [ ] DepartSoverePostMan ) {
//获取负责人岗位
var leaderPostList [ ] modelshr . Position
err := overall . CONSTANT_DB_HR . Model ( & modelshr . Position { } ) . Select ( "`id`,`name`" ) . Where ( "`state` = 1 AND `person_in_charge` = 1 AND `administrative_organization` = ?" , ordId ) . Find ( & leaderPostList ) . Error
if err != nil || len ( leaderPostList ) < 1 {
return
}
var isIn [ ] int64
for _ , v := range leaderPostList {
if IsInTrue [ int64 ] ( v . Id , isIn ) == false { //岗位
var postAboutManCont DepartSoverePostMan
postAboutManCont . Id = strconv . FormatInt ( v . Id , 10 )
postAboutManCont . Name = v . Name
postAboutManCont . People = GetManInPostList ( ordId , v . Id )
postAboutPeople = append ( postAboutPeople , postAboutManCont )
}
}
return postAboutPeople
}
/ *
获取岗位中的人及其职务
@ ordId 行政组织ID
@ postId 岗位ID
* /
func GetManInPostList ( ordId , postId int64 ) ( peopleList [ ] PeopleSoverePostMan ) {
//获取相关行政组织岗位的人员列表
var usList [ ] modelshr . PersonArchives
err := overall . CONSTANT_DB_HR . Model ( & modelshr . PersonArchives { } ) . Select ( "`id`,`number`,`name`,`job_id`" ) . Where ( "`state` = 1 AND `admin_org` = ? AND `position` = ? AND `emp_type` IN ?" , ordId , postId , overall . EmployeeStatusIng ) . Find ( & usList ) . Error
if err != nil || len ( usList ) < 1 {
return
}
for _ , v := range usList {
var peopleCont PeopleSoverePostMan
peopleCont . Id = strconv . FormatInt ( v . Id , 10 )
peopleCont . Number = v . Number
peopleCont . Name = v . Name
var duitesCont modelshr . Duties
duitesCont . GetCont ( map [ string ] interface { } { "`id`" : v . JobId } , "`id`" , "`name`" )
peopleCont . PostId = strconv . FormatInt ( duitesCont . Id , 10 )
peopleCont . PostName = duitesCont . Name
peopleList = append ( peopleList , peopleCont )
}
return
}
/ *
获取上级审批
@ userKey 用户KEy
@ ordId 行政组织ID
@ postId 岗位ID
@ sort 排序
@ contList 审批人列表
* /
func GetPositionList ( userKey , ordId , postId int64 , sort int , contList [ ] PositionDigui ) ( listCont [ ] PositionDigui ) {
var positionCont modelshr . PostDutiesJob
err := positionCont . GetCont ( map [ string ] interface { } { "`id`" : postId } )
if err != nil {
return
}
jsonStr , _ := json . Marshal ( positionCont )
fmt . Printf ( "positionCont---------------->%v\n" , string ( jsonStr ) )
if positionCont . JobType < 2 {
listCont = contList
return
} else {
if positionCont . PersonInCharge == 1 {
peopelAry := GetPeopleInPostList ( userKey , positionCont . AdministrativeOrganization , positionCont . Id )
if len ( peopelAry ) > 0 {
var cont PositionDigui
cont . Id = strconv . FormatInt ( positionCont . Id , 10 )
cont . Name = positionCont . Name
cont . OrgId = strconv . FormatInt ( positionCont . AdministrativeOrganization , 10 )
cont . Superior = strconv . FormatInt ( positionCont . Superior , 10 )
cont . Sort = sort
cont . People = peopelAry
contList = append ( contList , cont )
}
listCont = contList
return GetPositionList ( userKey , positionCont . AdministrativeOrganization , positionCont . Superior , sort + 1 , contList )
} else {
return GetPositionList ( userKey , positionCont . AdministrativeOrganization , positionCont . Superior , sort + 1 , contList )
}
}
return
}
/ *
获取岗位下人员列表
@ userKey 用户KEy
@ ordId 行政组织ID
@ postId 岗位ID
* /
func GetPeopleInPostList ( userKey , ordId , postId int64 ) ( peopleList [ ] PostPeople ) {
isTrue := false
//获取相关行政组织岗位的人员列表
var usList [ ] modelshr . PersonArchives
err := overall . CONSTANT_DB_HR . Model ( & modelshr . PersonArchives { } ) . Select ( "`id`,`key`,`number`,`name`,`job_id`,`wechat`,`work_wechat`,`company`,`maindeparment`,`admin_org`,`job_id`" ) . Where ( "`state` = 1 AND `admin_org` = ? AND `position` = ? AND `emp_type` IN ?" , ordId , postId , overall . EmployeeStatusIng ) . Find ( & usList ) . Error
if err != nil || len ( usList ) < 1 {
return
}
for _ , v := range usList {
if v . Key == userKey {
isTrue = true
}
wechatStr := v . Wechat
if v . WorkWechat != "" {
wechatStr = v . WorkWechat
}
if wechatStr != "" {
var peopleCont PostPeople
peopleCont . Id = strconv . FormatInt ( v . Id , 10 )
peopleCont . Number = v . Number
peopleCont . Name = v . Name
peopleCont . Company = strconv . FormatInt ( v . Company , 10 )
if v . Company != 0 {
var companyCont modelshr . AdministrativeOrganization
companyCont . GetCont ( map [ string ] interface { } { "`id`" : v . Company } , "`name`" )
peopleCont . CompanyName = companyCont . Name
}
if v . MainDeparment != 0 {
departmentId := GetGroupOrDepartPower ( v . AdminOrg , 1 )
peopleCont . Department = strconv . FormatInt ( departmentId , 10 )
var departCont modelshr . AdministrativeOrganization
departCont . GetCont ( map [ string ] interface { } { "`id`" : departmentId } , "`name`" )
peopleCont . DepartmentName = departCont . Name
}
peopleCont . OrgId = strconv . FormatInt ( v . AdminOrg , 10 )
if v . AdminOrg != 0 {
var orgCont modelshr . AdministrativeOrganization
orgCont . GetCont ( map [ string ] interface { } { "`id`" : v . AdminOrg } , "`name`" )
peopleCont . OrgName = orgCont . Name
}
var duitesCont modelshr . Duties
duitesCont . GetCont ( map [ string ] interface { } { "`id`" : v . JobId } , "`id`" , "`name`" )
peopleCont . DutiesId = strconv . FormatInt ( duitesCont . Id , 10 )
peopleCont . DutiesName = duitesCont . Name
peopleCont . Wechat = wechatStr
peopleList = append ( peopleList , peopleCont )
}
}
fmt . Printf ( "%v\n" , isTrue )
// if isTrue == true {
// var emptyAry []PostPeople
// peopleList = emptyAry
// }
return
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2022 - 11 - 19 15 : 01 : 33
@ 功能 : 获取岗位权限信息
@ 参数
# orgId 行政组织
# postId 岗位
# systemName 系统
@ 返回值
#
@ 方法原型
#
* /
func GetPostOfUsEmpowerCont ( orgId , postId int64 , systemName string ) ( sysPowerCont SystemPowerInfo , err error ) {
redisFileKey := fmt . Sprintf ( "Licence:LoginApi_%v_%v_%v" , systemName , orgId , postId )
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS3 )
userRedisToken , isTrue := redisClient . HashGetAll ( redisFileKey )
if isTrue == false {
var systemPowerCont modelssystempermission . Empower
err = systemPowerCont . GetCont ( map [ string ] interface { } { "`ordid`" : orgId , "`post_id`" : postId , "`system`" : systemName } )
if err != nil {
return
}
sysPowerCont . Id = systemPowerCont . Id
sysPowerCont . OrdId = systemPowerCont . OrdId //行政组织"`
sysPowerCont . PostId = systemPowerCont . PostId //岗位ID"`
sysPowerCont . System = systemPowerCont . System //系统"`
sysPowerCont . PointId = systemPowerCont . PointId //权限点位"`
sysPowerCont . State = systemPowerCont . State //状态(1:启用;2:禁用;3:删除)"`
sysPowerCont . Time = systemPowerCont . Time //创建时间"`
sysPowerCont . Level = systemPowerCont . Level //授权范围等级(1:本部门;2:本分部;3:所有)"`
sysPowerCont . Organization = systemPowerCont . Organization //行政组织"`
sysPowerCont . PointIdList = strings . Split ( systemPowerCont . PointId , "," )
sysPowerCont . OrganizationList = strings . Split ( systemPowerCont . Organization , "," )
myContRedis := MapOut [ string ] ( )
myContRedis [ "id" ] = systemPowerCont . Id
myContRedis [ "ordid" ] = systemPowerCont . OrdId
myContRedis [ "postid" ] = systemPowerCont . PostId
myContRedis [ "system" ] = systemPowerCont . System
myContRedis [ "pointid" ] = systemPowerCont . PointId
myContRedis [ "state" ] = systemPowerCont . State
myContRedis [ "time" ] = systemPowerCont . Time
myContRedis [ "level" ] = systemPowerCont . Level
myContRedis [ "organization" ] = systemPowerCont . Organization
redisClient . SetRedisTime ( 10800 )
redisClient . HashMsetAdd ( redisFileKey , myContRedis )
} else {
idInt , _ := strconv . ParseInt ( userRedisToken [ "id" ] , 10 , 64 )
sysPowerCont . Id = idInt
orgIdInt , _ := strconv . ParseInt ( userRedisToken [ "ordid" ] , 10 , 64 )
sysPowerCont . OrdId = orgIdInt //行政组织"`
postIdInt , _ := strconv . ParseInt ( userRedisToken [ "postid" ] , 10 , 64 )
sysPowerCont . PostId = postIdInt //岗位ID"`
sysPowerCont . System = userRedisToken [ "system" ] //系统"`
sysPowerCont . PointId = userRedisToken [ "pointid" ] //权限点位"`
stateInt , _ := strconv . Atoi ( userRedisToken [ "state" ] )
sysPowerCont . State = stateInt //状态(1:启用;2:禁用;3:删除)"`
timeInt , _ := strconv . ParseInt ( userRedisToken [ "time" ] , 10 , 64 )
sysPowerCont . Time = timeInt //创建时间"`
levelInt , _ := strconv . Atoi ( userRedisToken [ "level" ] )
sysPowerCont . Level = levelInt //授权范围等级(1:本部门;2:本分部;3:所有)"`
sysPowerCont . Organization = userRedisToken [ "organization" ] //行政组织"`
sysPowerCont . PointIdList = strings . Split ( userRedisToken [ "pointid" ] , "," )
sysPowerCont . OrganizationList = strings . Split ( userRedisToken [ "organization" ] , "," )
writeRedisData := MapOut [ string ] ( )
for i , v := range userRedisToken {
writeRedisData [ i ] = v
}
redisClient . SetRedisTime ( 10800 )
redisClient . HashMsetAdd ( redisFileKey , writeRedisData )
}
return
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2022 - 11 - 19 15 : 03 : 42
@ 功能 : 获取系统授权
@ 参数
# roleId 角色ID
# systemName 系统名称
# userKey 人员识别码
# orgId 行政组织
# postId 岗位
@ 返回值
# roleName 角色名称
# pointId 菜单权限
# operation 操作权限
# level 操作等级
@ 方法原型
# func GetNewAccredit ( systemName , roleId string , userKey , orgId , postId int64 ) ( roleName , pointId , operation string , level int )
* /
func GetNewAccredit ( systemName , roleId string , userKey , orgId , postId int64 ) ( roleName , pointId , operation string , level int ) {
// fmt.Printf("jsonStr---1--->%v---->%v---->%v---->%v---->%v\n", systemName, roleId, userKey, orgId, postId)
redisFileKey := fmt . Sprintf ( "Licence:PowerLoginApi_%v_%v_%v_%v" , systemName , userKey , orgId , postId )
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS3 )
userRedisToken , isTrue := redisClient . HashGetAll ( redisFileKey )
// fmt.Printf("jsonStr---2--->%v---->%v---->%v---->%v---->%v---->%v\n", systemName, roleId, userKey, orgId, postId, userRedisToken)
if isTrue == false {
var pointIdAry [ ] string
var operationAry [ ] string
if roleId != "" {
roleIdAry := strings . Split ( roleId , "," )
var roleCont [ ] modelssystempermission . SystemRole
if len ( roleIdAry ) > 0 {
//获取角色名称
err := overall . CONSTANT_DB_System_Permission . Model ( & modelssystempermission . SystemRole { } ) . Select ( "`name`" ) . Where ( "`id` IN ?" , roleIdAry ) . Find ( & roleCont ) . Error
if err == nil && len ( roleCont ) > 0 {
var roleNameAry [ ] string
for _ , rnv := range roleCont {
if IsInTrue [ string ] ( rnv . Name , roleNameAry ) == false {
roleNameAry = append ( roleNameAry , rnv . Name )
}
}
roleName = strings . Join ( roleNameAry , "|" )
}
//获取配置的所有角色权限
var roleEmpowerCont [ ] modelssystempermission . RoleEmpower
err = overall . CONSTANT_DB_System_Permission . Model ( & modelssystempermission . RoleEmpower { } ) . Select ( "`point_id`,`operation`,`level`" ) . Where ( "`system` = ? AND `role_id` IN ?" , systemName , roleIdAry ) . Find ( & roleEmpowerCont ) . Error
if err == nil && len ( roleEmpowerCont ) > 0 {
for _ , rev := range roleEmpowerCont {
menuList := strings . Split ( rev . PointId , "," )
for _ , mv := range menuList { //菜单权限
if mv != "" && IsInTrue [ string ] ( mv , pointIdAry ) == false {
pointIdAry = append ( pointIdAry , mv )
}
}
operList := strings . Split ( rev . Operation , "," )
for _ , ov := range operList { //操作权限
if ov != "" && IsInTrue [ string ] ( ov , operationAry ) == false {
operationAry = append ( operationAry , ov )
}
}
if level < rev . Level {
level = rev . Level //等级
}
}
}
}
}
//获取行政组织授权
if orgId > 0 && postId > 0 {
var orgEmpowerCont modelssystempermission . Empower
orgEmpowerCont . GetCont ( map [ string ] interface { } { "`ordid`" : orgId , "`post_id`" : postId , "`system`" : systemName } , "`point_id`" , "`operation`" , "`level`" )
if len ( pointIdAry ) < 1 { //判断是否已经配过权限
pointIdAry = strings . Split ( orgEmpowerCont . PointId , "," )
} else {
guoduPoin := strings . Split ( orgEmpowerCont . PointId , "," )
for _ , pv := range guoduPoin { //合并权限
if pv != "" && IsInTrue [ string ] ( pv , pointIdAry ) == false {
pointIdAry = append ( pointIdAry , pv )
}
}
}
if len ( operationAry ) < 1 { //判断是否已经配过权限
operationAry = strings . Split ( orgEmpowerCont . Operation , "," )
} else {
guoduOper := strings . Split ( orgEmpowerCont . Operation , "," )
for _ , gpv := range guoduOper { //合并权限
if gpv != "" && IsInTrue [ string ] ( gpv , operationAry ) == false {
operationAry = append ( operationAry , gpv )
}
}
}
if level < orgEmpowerCont . Level {
level = orgEmpowerCont . Level
}
}
pointId = strings . Join ( pointIdAry , "," )
operation = strings . Join ( operationAry , "," )
var powerCont EmpowerCont
powerCont . RoleName = roleName
powerCont . PointId = pointId
powerCont . Operation = operation
powerCont . Level = level
//组转写入redis
myContRedis := MapOut [ string ] ( )
myContRedis [ "roleName" ] = roleName
myContRedis [ "pointid" ] = pointId
myContRedis [ "operation" ] = operation
myContRedis [ "level" ] = level
redisClient . SetRedisTime ( 10800 )
redisClient . HashMsetAdd ( redisFileKey , myContRedis )
} else {
roleName = userRedisToken [ "roleName" ]
pointId = userRedisToken [ "pointid" ]
operation = userRedisToken [ "operation" ]
level , _ = strconv . Atoi ( userRedisToken [ "level" ] )
//组转写入redis
writeRedisData := MapOut [ string ] ( )
for i , v := range userRedisToken {
writeRedisData [ i ] = v
}
redisClient . SetRedisTime ( 10800 )
redisClient . HashMsetAdd ( redisFileKey , writeRedisData )
}
return
}
// 步骤名称
func GetSetpName ( setId int ) ( setpName string ) {
switch setId {
case 1 :
setpName = "创建申请"
case 2 :
setpName = "审核"
case 3 :
setpName = "责任划分"
case 4 :
setpName = "整改措施"
case 5 :
setpName = "整改验收"
case 6 :
setpName = "抄送"
case 7 :
// setpName = "部门负责人"
setpName = "审核确认"
default :
setpName = "创建申请"
}
return
}
// 步骤名称/节点类型 0:发起人;1:审批;2:抄送;3:执行节点;4:路由;5:条件;
func GetSetpNodeName ( setId int ) ( setpName string ) {
switch setId {
case 1 :
setpName = "审核"
case 2 :
setpName = "抄送"
case 3 :
setpName = "执行"
case 4 :
setpName = "路由"
case 5 :
setpName = "条件条件"
default :
setpName = "发起申请"
}
return
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2022 - 10 - 01 10 : 44 : 41
@ 功能 : 获取企业微信审批组相关负责人
@ 参数
# wechatTeamId 审批数据库节点ID
# departmentId 部门ID
@ 返回值
# userStrList 微信Openid
# err cuo
* /
func GetRefereeTeamWorkWechat ( wechatTeamId , departmentId int64 ) ( userStrList [ ] string , err error ) {
var orgCont modelshr . AdministrativeOrganization
err = orgCont . GetCont ( map [ string ] interface { } { "`id`" : departmentId } , "`wechat_organization_id`" )
// fmt.Printf("orgCont------------>%v\n", err)
if err != nil {
return
}
//获取角色组数据
var roleCont modelsschool . RoleGroup
err = roleCont . GetCont ( map [ string ] interface { } { "`srg_id`" : wechatTeamId } , "`srg_extatry`" , "`srg_type`" )
// fmt.Printf("orgCont:%v------------>roleCont:%v\n", err, roleCont)
if err != nil {
return
}
var roleUser [ ] roleGroupBodyAry
if roleCont . Type == 1 {
//矩阵
roleList := MapOut [ string ] ( )
err = json . Unmarshal ( [ ] byte ( roleCont . Contentes ) , & roleList )
if err != nil {
return
}
departmentIdStr := strconv . FormatInt ( orgCont . WechatOrganizationId , 10 )
// fmt.Printf("roleList------矩阵------>%v------>%v\n", roleList, departmentIdStr)
for i , v := range roleList {
if i == departmentIdStr {
jsonMAp , _ := json . Marshal ( v )
json . Unmarshal ( jsonMAp , & roleUser )
}
}
} else {
//个人
err = json . Unmarshal ( [ ] byte ( roleCont . Contentes ) , & roleUser )
}
if len ( roleUser ) < 1 {
err = fmt . Errorf ( "没有数据!" )
}
// fmt.Printf("roleUser------------>%v\n", roleUser)
for _ , v := range roleUser {
if IsInTrue [ string ] ( v . Id , userStrList ) == false {
userStrList = append ( userStrList , v . Id )
}
}
return
}
// 获取指定月的起止时间
func GetAppointMonthStarAndEndTime ( dayTime string ) ( startTime , endTime int64 ) {
dataTypeAll := "2006-01-02"
dayTime = fmt . Sprintf ( "%v-%v" , dayTime , "01" )
firstToTime := StringToTimeIng ( "d" , dayTime )
startTimeStr := fmt . Sprintf ( "%v 00:00:00" , firstToTime . AddDate ( 0 , 0 , 0 ) . Format ( dataTypeAll ) )
endTimeStr := fmt . Sprintf ( "%v 23:59:59" , firstToTime . AddDate ( 0 , 1 , - 1 ) . Format ( dataTypeAll ) )
// startTime = dayTime
startTime = DateToTimeStampOld ( startTimeStr )
endTime = DateToTimeStampOld ( endTimeStr )
return
}
// 获取指定月的起止时间副本
func GetAppointMonthStarAndEndTimeEs ( dayTime string ) ( startTime , endTime int64 ) {
dataTypeAll := "2006-01-02"
firstToTime := StringToTimeIng ( "d" , dayTime )
startTimeStr := fmt . Sprintf ( "%v 00:00:00" , firstToTime . AddDate ( 0 , 0 , 0 ) . Format ( dataTypeAll ) )
endTimeStr := fmt . Sprintf ( "%v 23:59:59" , firstToTime . AddDate ( 0 , 1 , - 1 ) . Format ( dataTypeAll ) )
// startTime = dayTime
startTime , _ = DateToTimeStamp ( startTimeStr )
endTime , _ = DateToTimeStamp ( endTimeStr )
return
}
// 日期字符串转换成time格式
func StringToTimeIng ( unit , str string ) ( res time . Time ) {
loc , _ := time . LoadLocation ( "Local" )
// str := t.ToString()
layout , ok := timeLayoutMap [ unit ]
if ! ok {
layout = timeLayoutMap [ "s" ]
}
res , _ = time . ParseInLocation ( layout , str , loc )
return
}
// 递归无限极菜单树
/ *
@ jurisd 起始位置
@ parentId 上级ID
@ threeData 结果值
@ oper 已付权限
* /
func GetMenuThreePeiQuan ( jurisd int , parentId string , threeData [ ] MenuContList , oper [ ] string ) [ ] PowerThree {
treeList := [ ] PowerThree { }
for _ , v := range threeData {
if v . ParentId == parentId {
child := GetMenuThreePeiQuan ( jurisd , v . Id , threeData , oper )
var node PowerThree
node . Id = v . Id
node . Name = v . Name
node . ParentId = v . ParentId
node . IsTrue = v . IsTrue
isTrue , menuOper := MenuOperationPeiQuan ( jurisd , v . Id , oper )
if isTrue == true {
node . MenuOperation = menuOper
// fmt.Printf("GetMenuThree-1111--%v--->%v\n", v.Id, menuOper)
}
node . Child = child
treeList = append ( treeList , node )
}
}
return treeList
}
// 配权
// 获取菜单操作项目
/ *
@ jurisd 起始位置
@ menuId 菜单ID
@ oper 已付权限
* /
func MenuOperationPeiQuan ( jurisd int , menuId string , oper [ ] string ) ( isTrue bool , operation [ ] MenuContList ) {
var operList [ ] modelsschool . MenuOperation
isTrue = false
operErr := overall . CONSTANT_DB_Master . Where ( "`menu_id` = ?" , menuId ) . Order ( "oper_id desc" ) . Find ( & operList ) . Error
if operErr != nil || len ( operList ) < 1 {
return
}
isTrue = true
for i := 0 ; i < len ( operList ) ; i ++ {
var menSmaiCont MenuContList
idStr := strconv . FormatInt ( operList [ i ] . OperId , 10 )
menSmaiCont . Id = idStr
menSmaiCont . Name = operList [ i ] . OperTitle
menSmaiCont . ParentId = strconv . FormatInt ( operList [ i ] . MenuId , 10 )
if IsInTrue [ string ] ( idStr , oper ) == true {
menSmaiCont . IsTrue = true
}
operation = append ( operation , menSmaiCont )
}
// fmt.Printf("ApiUrl---%v--->%v--->%v--->%v\n", menuId, isTrue, operErr, operList)
return
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2023 - 01 - 03 16 : 41 : 19
@ 功能 : 合并数组
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func MergeStruct [ T GenericityVariable ] ( aryOen , aryTwo [ ] T ) ( structAry [ ] T ) {
if len ( aryOen ) >= len ( aryTwo ) {
structAry = aryOen
for i := 0 ; i < len ( aryTwo ) ; i ++ {
if IsInTrue [ T ] ( aryTwo [ i ] , structAry ) == false {
structAry = append ( structAry , aryTwo [ i ] )
}
}
} else {
structAry = aryTwo
for i := 0 ; i < len ( aryOen ) ; i ++ {
if IsInTrue [ T ] ( aryOen [ i ] , structAry ) == false {
structAry = append ( structAry , aryOen [ i ] )
}
}
}
return
}
// 根据字符串组合时间
/ *
# dateTime 日期
* /
func ( d * DateTimeTotimes ) BaisStrToTime ( dateTime string ) {
timeStrAry := strings . Split ( dateTime , "-" )
switch len ( timeStrAry ) {
case 1 :
dateTime = fmt . Sprintf ( "%v-01-01 12:00:00" , dateTime )
case 2 :
if len ( timeStrAry [ 1 ] ) < 2 {
dateTime = fmt . Sprintf ( "%v-0%v-01 12:00:00" , timeStrAry [ 0 ] , timeStrAry [ 1 ] )
}
case 3 :
monthStr := timeStrAry [ 1 ]
if len ( timeStrAry [ 1 ] ) < 2 {
monthStr = fmt . Sprintf ( "0%v" , timeStrAry [ 1 ] )
}
dayAry := strings . Split ( timeStrAry [ 2 ] , " " )
// fmt.Printf("dayAry:%v------>%v\n", dayAry, len(dayAry))
dayStr := dayAry [ 0 ]
if len ( dayAry [ 0 ] ) < 2 {
dayStr = fmt . Sprintf ( "0%v" , dayAry [ 0 ] )
}
if len ( dayAry ) > 1 {
// fmt.Printf("dayAry[1]:%v------>%v\n", dayAry[1], len(dayAry[1]))
if len ( dayAry [ 1 ] ) > 0 {
Hours := "00"
minutes := "00"
seconds := "00"
hisAry := strings . Split ( dayAry [ 1 ] , ":" )
switch len ( hisAry ) {
case 1 :
if len ( hisAry [ 0 ] ) < 2 {
Hours = fmt . Sprintf ( "0%v" , hisAry [ 0 ] )
} else {
Hours = hisAry [ 0 ]
}
case 2 :
if len ( hisAry [ 0 ] ) < 2 {
Hours = fmt . Sprintf ( "0%v" , hisAry [ 0 ] )
} else {
Hours = hisAry [ 0 ]
}
if len ( hisAry [ 1 ] ) < 2 {
minutes = fmt . Sprintf ( "0%v" , hisAry [ 1 ] )
} else {
minutes = hisAry [ 1 ]
}
case 3 :
if len ( hisAry [ 0 ] ) < 2 {
Hours = fmt . Sprintf ( "0%v" , hisAry [ 0 ] )
} else {
Hours = hisAry [ 0 ]
}
if len ( hisAry [ 1 ] ) < 2 {
minutes = fmt . Sprintf ( "0%v" , hisAry [ 1 ] )
} else {
minutes = hisAry [ 1 ]
}
if len ( hisAry [ 2 ] ) < 2 {
seconds = fmt . Sprintf ( "0%v" , hisAry [ 2 ] )
} else {
seconds = hisAry [ 2 ]
}
default :
}
dayStr = fmt . Sprintf ( "%v %v:%v:%v" , dayStr , Hours , minutes , seconds )
}
}
// dayStr := timeStrAry[2]
// if len(timeStrAry[2]) < 2 {
// dayStr = fmt.Sprintf("0%v", timeStrAry[2])
// }
dateTime = fmt . Sprintf ( "%v-%v-%v" , timeStrAry [ 0 ] , monthStr , dayStr )
default :
}
fmt . Printf ( "dateTime:%v---1--->%v\n" , dateTime , len ( dateTime ) )
orgTime , orgTimeErr := DateToTimeStamp ( fmt . Sprintf ( "%v-01-01 12:00:00" , dateTime ) )
if orgTimeErr {
d . AllTime = orgTime
d . Years = strconv . FormatInt ( ComputingTime ( orgTime , 1 ) , 10 )
d . Quarter = strconv . FormatInt ( ComputingTime ( orgTime , 2 ) , 10 )
d . Months = strconv . FormatInt ( ComputingTime ( orgTime , 3 ) , 10 )
d . Week = strconv . FormatInt ( ComputingTime ( orgTime , 4 ) , 10 )
d . Days = strconv . FormatInt ( ComputingTime ( orgTime , 5 ) , 10 )
d . Hours = strconv . FormatInt ( ComputingTime ( orgTime , 7 ) , 10 )
d . Minutes = strconv . FormatInt ( ComputingTime ( orgTime , 8 ) , 10 )
d . Second = strconv . FormatInt ( ComputingTime ( orgTime , 9 ) , 10 )
} else {
orgTime , orgTimeErr = DateToTimeStamp ( fmt . Sprintf ( "%v-01 12:00:00" , dateTime ) )
if orgTimeErr {
d . AllTime = orgTime
d . Years = strconv . FormatInt ( ComputingTime ( orgTime , 1 ) , 10 )
d . Quarter = strconv . FormatInt ( ComputingTime ( orgTime , 2 ) , 10 )
d . Months = strconv . FormatInt ( ComputingTime ( orgTime , 3 ) , 10 )
d . Week = strconv . FormatInt ( ComputingTime ( orgTime , 4 ) , 10 )
d . Days = strconv . FormatInt ( ComputingTime ( orgTime , 5 ) , 10 )
d . Hours = strconv . FormatInt ( ComputingTime ( orgTime , 7 ) , 10 )
d . Minutes = strconv . FormatInt ( ComputingTime ( orgTime , 8 ) , 10 )
d . Second = strconv . FormatInt ( ComputingTime ( orgTime , 9 ) , 10 )
fmt . Printf ( "dateTime:%v---2--->%v--->%v\n" , orgTime , d . AllTime , d . Quarter )
} else {
orgTime , orgTimeErr = DateToTimeStamp ( fmt . Sprintf ( "%v 12:00:00" , dateTime ) )
if orgTimeErr {
d . AllTime = orgTime
d . Years = strconv . FormatInt ( ComputingTime ( orgTime , 1 ) , 10 )
d . Quarter = strconv . FormatInt ( ComputingTime ( orgTime , 2 ) , 10 )
d . Months = strconv . FormatInt ( ComputingTime ( orgTime , 3 ) , 10 )
d . Week = strconv . FormatInt ( ComputingTime ( orgTime , 4 ) , 10 )
d . Days = strconv . FormatInt ( ComputingTime ( orgTime , 5 ) , 10 )
d . Hours = strconv . FormatInt ( ComputingTime ( orgTime , 7 ) , 10 )
d . Minutes = strconv . FormatInt ( ComputingTime ( orgTime , 8 ) , 10 )
d . Second = strconv . FormatInt ( ComputingTime ( orgTime , 9 ) , 10 )
} else {
orgTime , orgTimeErr = DateToTimeStamp ( fmt . Sprintf ( "%v:00:00" , dateTime ) )
if orgTimeErr {
d . AllTime = orgTime
d . Years = strconv . FormatInt ( ComputingTime ( orgTime , 1 ) , 10 )
d . Quarter = strconv . FormatInt ( ComputingTime ( orgTime , 2 ) , 10 )
d . Months = strconv . FormatInt ( ComputingTime ( orgTime , 3 ) , 10 )
d . Week = strconv . FormatInt ( ComputingTime ( orgTime , 4 ) , 10 )
d . Days = strconv . FormatInt ( ComputingTime ( orgTime , 5 ) , 10 )
d . Hours = strconv . FormatInt ( ComputingTime ( orgTime , 7 ) , 10 )
d . Minutes = strconv . FormatInt ( ComputingTime ( orgTime , 8 ) , 10 )
d . Second = strconv . FormatInt ( ComputingTime ( orgTime , 9 ) , 10 )
} else {
orgTime , orgTimeErr = DateToTimeStamp ( fmt . Sprintf ( "%v:00" , dateTime ) )
if orgTimeErr {
d . AllTime = orgTime
d . Years = strconv . FormatInt ( ComputingTime ( orgTime , 1 ) , 10 )
d . Quarter = strconv . FormatInt ( ComputingTime ( orgTime , 2 ) , 10 )
d . Months = strconv . FormatInt ( ComputingTime ( orgTime , 3 ) , 10 )
d . Week = strconv . FormatInt ( ComputingTime ( orgTime , 4 ) , 10 )
d . Days = strconv . FormatInt ( ComputingTime ( orgTime , 5 ) , 10 )
d . Hours = strconv . FormatInt ( ComputingTime ( orgTime , 7 ) , 10 )
d . Minutes = strconv . FormatInt ( ComputingTime ( orgTime , 8 ) , 10 )
d . Second = strconv . FormatInt ( ComputingTime ( orgTime , 9 ) , 10 )
} else {
orgTime , orgTimeErr = DateToTimeStamp ( dateTime )
if orgTimeErr {
d . AllTime = orgTime
d . Years = strconv . FormatInt ( ComputingTime ( orgTime , 1 ) , 10 )
d . Quarter = strconv . FormatInt ( ComputingTime ( orgTime , 2 ) , 10 )
d . Months = strconv . FormatInt ( ComputingTime ( orgTime , 3 ) , 10 )
d . Week = strconv . FormatInt ( ComputingTime ( orgTime , 4 ) , 10 )
d . Days = strconv . FormatInt ( ComputingTime ( orgTime , 5 ) , 10 )
d . Hours = strconv . FormatInt ( ComputingTime ( orgTime , 7 ) , 10 )
d . Minutes = strconv . FormatInt ( ComputingTime ( orgTime , 8 ) , 10 )
d . Second = strconv . FormatInt ( ComputingTime ( orgTime , 9 ) , 10 )
}
}
}
}
}
}
}
//统一图标计算最大值最小值方法
/ *
maxVal 最大值
minVal 最小值
* /
func JudjeMaxOfMinVal ( maxVal , minVal float64 ) ( maxVals , minVals float64 ) {
if maxVal > 0 {
if minVal > 0 {
if maxVal < 10 {
if maxVal < 1 {
maxVal = math . Ceil ( maxVal ) + 0.1
minVals = math . Ceil ( minVal ) - 0.1
} else {
maxVal = math . Ceil ( maxVal ) + 1
minVals = math . Ceil ( minVal ) - 1
}
} else {
jianGe := math . Ceil ( ( maxVal - minVal ) / 5 )
if jianGe <= 0 {
jianGe = 1
}
maxVals = math . Ceil ( maxVal ) + jianGe
minVals = math . Ceil ( minVal ) - jianGe
if minVals < 0 {
minVals = 0
}
}
} else {
jianGe := math . Ceil ( maxVal / 5 )
maxVals = math . Ceil ( maxVal ) + jianGe
}
} else {
if minVal > - 1 {
minVals = minVal - 0.1
} else {
maxGuoDu := maxVal * - 1
minGuoDu := minVal * - 1
jianGe := math . Ceil ( ( minGuoDu - maxGuoDu ) / 5 )
if jianGe > 0 {
minVals = minVal - jianGe
} else {
minVals = minVal - 1
}
}
}
// fmt.Printf("ge---1-->%v----->%v\n", maxVals, minVals)
return
}
// 获取行政组织所有上级
func ( g * GetOrgAllParent ) GetOrgParentAllId ( orgId int64 ) {
var orgCont modelshr . AdministrativeOrganization
err := orgCont . GetCont ( map [ string ] interface { } { "`id`" : orgId , "`state`" : 1 } , "`superior`" )
if err == nil {
if IsInTrue [ int64 ] ( orgId , g . Id ) == false {
g . Id = append ( g . Id , orgId )
}
g . GetOrgParentAllId ( orgCont . Superior )
} else {
return
}
}
// 获取所有下级
func ( g * GetOrgAllParent ) GetOrgSonAllId ( orgId int64 ) {
var orgAry [ ] int64
if orgId != 0 {
err := overall . CONSTANT_DB_HR . Model ( & modelshr . AdministrativeOrganization { } ) . Select ( "`id`" ) . Where ( "`state` = 1 AND `superior` = ?" , orgId ) . Find ( & orgAry ) . Error
if err != nil {
return
}
for _ , v := range orgAry {
if ! IsInTrue [ int64 ] ( v , g . Id ) {
g . Id = append ( g . Id , v )
g . GetOrgSonAllId ( v )
} else {
g . GetOrgSonAllId ( v )
}
}
}
}
// 获取行政组织所有上级和下级
func HaveAllOrgRelation ( orgId int64 ) [ ] int64 {
// departmentId := RecursionOrgLeve(orgId, 4)
// fmt.Printf("获取行政组--->%v--->%v\n", departmentId, orgId)
var getAllOrg GetOrgAllParent
// getAllOrg.GetOrgParentAllId(departmentId)
// getAllOrg.GetOrgSonAllId(departmentId)
getAllOrg . Id = append ( getAllOrg . Id , orgId )
getAllOrg . GetOrgParent ( orgId , 4 )
// fmt.Printf("获取行政组--2222->%v--->%v\n", getAllOrg.Id, orgId)
return getAllOrg . Id
}
// 获取上下级
func ( g * GetOrgAllParent ) GetOrgParent ( orgId , level int64 ) {
if orgId != 0 {
var orgCont modelshr . OrgContType
err := orgCont . GetCont ( map [ string ] interface { } { "`id`" : orgId , "`state`" : 1 } , "`superior`" , "level" )
if err == nil {
// fmt.Printf("获取行政组--2222->%v--->%v\n", orgCont.Level, level)
if orgCont . Level >= level {
g . GetOrgSonAllId ( orgId )
g . GetOrgParent ( orgCont . Superior , level )
}
}
}
}
//计算得分
/ *
参数
@ targetScore 指标分值
@ resultval 结算值
@ allPrizes 全奖值
@ zeroPrizes 零奖值
@ CappingVals 封顶值
@ typeClass 1 : 定性 ; 2 : 定量 ; 3 : 观察指标
返回说明
@ scoreVal 计算得分
@ allPrize 全奖值
@ zeroPrize 零奖值
@ CappingVal 封顶值
@ achievement 达成率
func CalculateScore ( targetScore int64 , resultval , allPrizes , zeroPrizes , CappingVals float64 , typeClass int ) ( scoreVal , allPrize , zeroPrize , CappingVal , achievement float64 )
* /
func CalculateScore ( targetScore int64 , resultval , allPrizes , zeroPrizes , CappingVals float64 , typeClass int ) ( scoreVal , allPrize , zeroPrize , CappingVal , achievement float64 ) {
allPrize = allPrizes / 100
zeroPrize = zeroPrizes / 100
CappingVal = CappingVals / 100
resultval = resultval / 100
//fmt.Printf("达成率--1-->targetScore:%v-->resultval:%v-->allPrize:%v-->zeroPrize:%v-->CappingVal:%v\n", targetScore, resultval, allPrize, zeroPrize, CappingVal)
//不修正精度的达成率
var achievementAll float64 = 0
if allPrize == 0 && zeroPrize == 0 { //全奖值与零奖值都为0 那么达成率 100 和实际得分是 指标分
achievement = 100
scoreVal = float64 ( targetScore )
if typeClass == 2 {
if resultval <= 0 {
scoreVal = 0
}
}
achievementAll = 100
//fmt.Printf("达成率--11-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
if allPrize > zeroPrize { //如果全奖值大于零奖值 执行一下操作
if resultval <= zeroPrize { //实际结算值小于零奖值 那么达成率和实际得分都是0
achievement = 0
scoreVal = 0
achievementAll = 0
// } else if resultval > allPrize { //实际结算值大于全奖值 执行一下操作
//fmt.Printf("达成率--7-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else { //实际结算值在全奖值 与 零奖值之间
chuShu := resultval - float64 ( zeroPrize )
beiChuShu := float64 ( allPrize ) - float64 ( zeroPrize )
if beiChuShu != 0 {
achievement = DecimalEs ( chuShu / beiChuShu , 4 )
achievementAll = chuShu / beiChuShu
if achievement <= 0 {
//如果在全奖值大于零件值的情况下出现达成率为0或负数,则达成率和实际得分都是0
achievement = 0
scoreVal = 0
achievementAll = 0
//fmt.Printf("达成率--8-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
//fmt.Printf("达成率--9-1->targetScore:%v-->resultval:%v-->scoreVal:%v-->allPrize:%v-->zeroPrize:%v-->CappingVal:%v-->achievement:%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
if achievement * 100 >= CappingVal {
//如果达成率大于等于封顶值
if CappingVal > 0 {
scoreVal = ( CappingVal / 100 ) * float64 ( targetScore )
//fmt.Printf("达成率--9-2->targetScore:%v-->resultval:%v-->scoreVal:%v-->allPrize:%v-->zeroPrize:%v-->CappingVal:%v-->achievement:%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
//fmt.Printf("达成率--9-3->targetScore:%v-->resultval:%v-->scoreVal:%v-->allPrize:%v-->zeroPrize:%v-->CappingVal:%v-->achievement:%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
scoreVal = float64 ( targetScore )
}
} else {
// scoreVal = achievement * (float64(targetScore))
scoreVal = achievementAll * ( float64 ( targetScore ) )
//fmt.Printf("达成率--9-4->targetScore:%v-->resultval:%v-->scoreVal:%v-->allPrize:%v-->zeroPrize:%v-->CappingVal:%v-->achievement:%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
}
//fmt.Printf("达成率--9-->targetScore:%v-->resultval:%v-->scoreVal:%v-->allPrize:%v-->zeroPrize:%v-->CappingVal:%v-->achievement:%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
}
achievement = DecimalEs ( achievement * 100 , 4 )
} else {
//被除数为0时 那么达成率和实际得分都是0
achievement = 0
scoreVal = 0
achievementAll = 0
//fmt.Printf("达成率--10-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
}
}
} else { //如果全奖值小于零奖值 执行一下操作
if resultval >= zeroPrize { //实际结算值大于零奖值 那么达成率和实际得分都是0
achievement = 0
scoreVal = 0
achievementAll = 0
//fmt.Printf("达成率--1-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
chuShu := resultval - float64 ( zeroPrize )
beiChuShu := float64 ( allPrize ) - float64 ( zeroPrize )
if beiChuShu != 0 {
achievement = DecimalEs ( chuShu / beiChuShu , 4 )
achievementAll = chuShu / beiChuShu
if achievement <= 0 {
//如果在全奖值大于零件值的情况下出现达成率为0或负数,则达成率和实际得分都是0
achievement = 0
scoreVal = 0
achievementAll = 0
//fmt.Printf("达成率--2-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
if achievement * 100 >= CappingVal {
//如果达成率大于等于封顶值
scoreVal = CappingVal * float64 ( targetScore ) / 100
//fmt.Printf("达成率--3-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
// scoreVal = achievement * (float64(targetScore))
scoreVal = achievementAll * ( float64 ( targetScore ) )
//fmt.Printf("达成率--4-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
}
}
achievement = DecimalEs ( achievement * 100 , 4 )
//fmt.Printf("达成率--6-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
} else {
//被除数为0时 那么达成率和实际得分都是0
achievement = 0
scoreVal = 0
achievementAll = 0
//fmt.Printf("达成率--5-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
}
}
}
}
if typeClass == 3 {
scoreVal = float64 ( targetScore )
//fmt.Printf("达成率--11-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
}
scoreVal = DecimalEs ( scoreVal , 2 )
allPrize = DecimalEs ( allPrize , 2 )
zeroPrize = DecimalEs ( zeroPrize , 2 )
CappingVal = DecimalEs ( CappingVal , 2 )
achievement = DecimalEs ( achievement , 4 )
//fmt.Printf("达成率--12-->%v-->%v-->%v-->%v-->%v-->%v-->%v\n", targetScore, resultval, scoreVal, allPrize, zeroPrize, CappingVal, achievement)
return
}
// 字符串数子转int64
func StrNumberToInt64 ( val string , cheng float64 ) ( valInt int64 ) {
valFloat , _ := strconv . ParseFloat ( val , 64 )
valFloatGd := DecimalEs ( valFloat * cheng , 2 )
valStr := strconv . FormatFloat ( valFloatGd , 'f' , - 1 , 64 )
valInt , _ = strconv . ParseInt ( valStr , 10 , 64 )
return
}
/ *
递归无限极菜单树
* /
func GetMenuRouterThree ( parentId int , threeData [ ] modelAppPlatform . Menus ) [ ] MenusRouterThree {
treeList := [ ] MenusRouterThree { }
for _ , v := range threeData {
if v . ParentId == parentId {
child := GetMenuRouterThree ( v . Id , threeData )
var node MenusRouterThree
node . Path = v . Path //路由路径
node . Component = v . Component //组件路径
node . Redirect = v . Redirect //跳转链接
node . Name = v . Name //路由名称
var metaCont MenusRouterThreeMet
metaCont . Perm = strconv . FormatInt ( v . Perm , 10 )
metaCont . Title = v . Name //路由title
metaCont . Icon = v . Icon //ICON
if v . Visible == 1 {
metaCont . Hidden = false //否隐藏
} else {
metaCont . Hidden = true //否隐藏
}
metaCont . Roles = [ ] string { } //拥有路由权限的角色编码
metaCont . KeepAlive = false //是否开启缓存
node . Meta = metaCont //路由属性类型
node . Children = child //子路由列表
// // fmt.Printf("GetMenuThree-22222--%v--->%v\n", v.Id, node)
treeList = append ( treeList , node )
}
}
return treeList
}
/ *
递归无限极菜单树
* /
func GetAppMenuThree ( parentId int , threeData [ ] modelAppPlatform . Menus ) [ ] AppMenusThree {
treeList := [ ] AppMenusThree { }
for _ , v := range threeData {
if v . ParentId == parentId {
child := GetAppMenuThree ( v . Id , threeData )
var node AppMenusThree
node . Id = v . Id //
node . Name = v . Name //菜单名称"`
node . Types = v . Types //菜单类型(1-菜单;2-目录;3-外链;4-按钮权限"`
node . Path = v . Path //路由路径"`
node . Component = v . Component //组件路径(vue页面完整路径,省略.vue后缀)"`
node . Perm = v . Perm // 权限标识"`
node . Visible = v . Visible //显示状态(1:显示;2:隐藏,3:删除)"`
node . Sort = v . Sort //排序(数字越小排名越靠前))"`
node . Icon = v . Icon //菜单图标"`
node . Redirect = v . Redirect //跳转路径"`
node . ParentId = v . ParentId //父菜单ID"`
node . Time = v . Time //创建时间"`
node . Class = MenuType ( v . Types )
node . PermCode = strconv . FormatInt ( v . Perm , 10 )
node . Children = child //子路由列表
// // fmt.Printf("GetMenuThree-22222--%v--->%v\n", v.Id, node)
treeList = append ( treeList , node )
}
}
return treeList
}
func GetMenuOptionsThree ( parentId int , threeData [ ] modelAppPlatform . Menus ) [ ] AppMenusOptionsThree {
treeList := [ ] AppMenusOptionsThree { }
for _ , v := range threeData {
if v . ParentId == parentId {
child := GetMenuOptionsThree ( v . Id , threeData )
var node AppMenusOptionsThree
node . Label = v . Name //路由名称
node . Value = v . Id //路由ID
node . Children = child //子路由列表
// // fmt.Printf("GetMenuThree-22222--%v--->%v\n", v.Id, node)
treeList = append ( treeList , node )
}
}
return treeList
}
// 菜单类型对照
func MenuType ( class int ) string {
switch class {
case 1 :
return "MENU"
case 2 :
return "CATALOG"
case 3 :
return "EXTLINK"
case 4 :
return "BUTTON"
default :
return "CATALOG"
}
return "CATALOG"
}
func MenuTypeToInt ( class string ) int {
switch class {
case "MENU" :
return 1
case "CATALOG" :
return 2
case "EXTLINK" :
return 3
case "BUTTON" :
return 4
default :
return 2
}
return 2
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2023 - 0 9 - 14 13 : 33 : 12
@ 功能 : 获取指定括号中的数据
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func MatchBracket ( s , starBracket , endBracket string ) string {
i := strings . Index ( s , starBracket )
if i >= 0 {
// fmt.Printf("match-i-->%v\n", i)
j := strings . Index ( s [ i : ] , endBracket )
if j >= 0 {
// fmt.Printf("match-j-->%v-->%v\n", j, s[i+1:i+j])
return s [ i + 1 : i + j ]
}
}
return ""
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2023 - 0 9 - 14 16 : 01 : 13
@ 功能 : 通用执行SQL原生语句
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func ExecSql ( database , sqlStr string ) ( err error ) {
switch database {
case "Master" :
err = overall . CONSTANT_DB_Master . Exec ( sqlStr ) . Error
case "AppPlatform" :
err = overall . CONSTANT_DB_AppPlatform . Exec ( sqlStr ) . Error
case "Wechat" :
err = overall . CONSTANT_DB_Wechat . Exec ( sqlStr ) . Error
case "HR" :
err = overall . CONSTANT_DB_HR . Exec ( sqlStr ) . Error
case "FILE_BOOK" :
err = overall . CONSTANT_DB_FILE_BOOK . Exec ( sqlStr ) . Error
case "ERROR_SUBJECT" :
err = overall . CONSTANT_DB_ERROR_SUBJECT . Exec ( sqlStr ) . Error
case "MY_TEST" :
err = overall . CONSTANT_DB_MY_TEST . Exec ( sqlStr ) . Error
case "SCORING" :
err = overall . CONSTANT_DB_SCORING . Exec ( sqlStr ) . Error
case "QA" :
err = overall . CONSTANT_DB_QA . Exec ( sqlStr ) . Error
case "BILLBOARD" :
err = overall . CONSTANT_DB_BILLBOARD . Exec ( sqlStr ) . Error
case "HEALTH" :
err = overall . CONSTANT_DB_HEALTH . Exec ( sqlStr ) . Error
case "KPI" :
err = overall . CONSTANT_DB_KPI . Exec ( sqlStr ) . Error
case "WECHAT_LOG" :
err = overall . CONSTANT_DB_WECHAT_LOG . Exec ( sqlStr ) . Error
case "MANAGE_ARCHIVES" :
err = overall . CONSTANT_DB_MANAGE_ARCHIVES . Exec ( sqlStr ) . Error
case "System_Permission" :
err = overall . CONSTANT_DB_System_Permission . Exec ( sqlStr ) . Error
case "DB_Storage" :
err = overall . CONSTANT_DB_Storage . Exec ( sqlStr ) . Error
case "DB_Server" :
err = overall . CONSTANT_DB_Server . Exec ( sqlStr ) . Error
case "Tidb" :
err = overall . CONSTANT_DB_Tidb . Exec ( sqlStr ) . Error
case "CustomerForm" :
err = overall . CONSTANT_DB_CustomerForm . Exec ( sqlStr ) . Error
default :
}
return
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2023 - 0 9 - 22 11 : 28 : 12
@ 功能 : 获取指定行政组织id , 所有子类
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func ( g * GetOrgAllParent ) GetOrgSun ( superior int64 ) {
var id [ ] int64
if superior == 0 {
return
}
err := overall . CONSTANT_DB_HR . Model ( & modelshr . AdministrativeOrganization { } ) . Select ( "`id`" ) . Where ( "`state` = 1 AND `superior` = ?" , superior ) . Find ( & id ) . Error
if err != nil || len ( id ) < 1 {
return
}
for _ , v := range id {
if ! IsInTrue [ int64 ] ( v , g . Id ) {
g . Id = append ( g . Id , v )
}
g . GetOrgSun ( v )
}
}