应用集成平台服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1305 lines
37 KiB

package menus
import (
"appPlatform/middleware/grocerystore"
"appPlatform/models/modelAppPlatform"
"appPlatform/models/modelshr"
"appPlatform/models/modelssystempermission"
"appPlatform/models/teamlog"
"appPlatform/overall"
"appPlatform/overall/publicmethod"
"encoding/json"
"errors"
"fmt"
"sort"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
// 全局变量
var allRulesLog teamlog.TeamsLog
/*
*
@ 作者: 秦东
@ 时间: 2023-05-22 13:26:16
@ 功能: 获取路由树
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetMenusThree(c *gin.Context) {
var menusList []modelAppPlatform.Menus
err := overall.CONSTANT_DB_AppPlatform.Where("`type` IN ? AND `visible` = ? AND `outside` IN ?", []int{1, 2, 3}, 1, []int{1, 3}).Order("sort ASC").Find(&menusList).Error
if err != nil && len(menusList) < 1 {
publicmethod.Result(1, err, c, "没有路由!")
return
}
// sort.Slice(menusList, func(i, j int) bool {
// return menusList[i].Sort > menusList[j].Sort
// })
routerThree := publicmethod.GetMenuRouterThree(0, menusList)
publicmethod.Result(0, routerThree, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-22 15:36:33
@ 功能: 获取菜单列表树
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetMenusListTree(c *gin.Context) {
// var requestData ShearMenu
// c.ShouldBindJSON(&requestData)
// c.ShouldBindQuery(&requestData)
// id := c.Query("id")
requestData := c.Query("keywords")
fmt.Printf("没有路由!=====>%v\n", requestData)
var menusList []modelAppPlatform.Menus
gormDb := overall.CONSTANT_DB_AppPlatform.Where("visible IN ?", []int{1, 2})
if requestData != "" {
gormDb = gormDb.Where("`name` LIKE ?", "%"+requestData+"%")
}
err := gormDb.Find(&menusList).Error
if err != nil && len(menusList) < 1 {
publicmethod.Result(1, err, c, "没有路由!")
return
}
sort.Slice(menusList, func(i, j int) bool {
return menusList[i].Sort < menusList[j].Sort
})
routerThree := publicmethod.GetAppMenuThree(0, menusList)
publicmethod.Result(0, routerThree, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-22 16:21:11
@ 功能: 菜单下拉列表
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) MenuOptions(c *gin.Context) {
var menusList []modelAppPlatform.Menus
err := overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.Menus{}).Select("`id`,`name`,`parentId`").Where("visible IN ?", []int{1, 2}).Find(&menusList).Error
if err != nil && len(menusList) < 1 {
publicmethod.Result(1, err, c, "没有路由!")
return
}
routerThree := publicmethod.GetMenuOptionsThree(0, menusList)
publicmethod.Result(0, routerThree, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-22 16:40:42
@ 功能: 新增菜单
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) AddNewMenu(c *gin.Context) {
var requestData AddNewMenuCont
c.ShouldBindJSON(&requestData)
if requestData.Name == "" {
publicmethod.Result(1, requestData, c, "请输入菜单名称!")
return
}
if requestData.Visible == 0 {
requestData.Visible = 1
}
if requestData.Sort == 0 {
requestData.Sort = 50
}
if requestData.Outside == 0 {
requestData.Sort = 1
}
types := publicmethod.MenuTypeToInt(requestData.Types)
var menuCont modelAppPlatform.Menus
menuCont.Name = requestData.Name //菜单名称"`
menuCont.Types = types //菜单类型(1-菜单;2-目录;3-外链;4-按钮权限"`
menuCont.Path = requestData.Path //路由路径"`
if types == 2 {
if requestData.ParentId == 0 {
menuCont.Component = "Layout" //组件路径(vue页面完整路径,省略.vue后缀)"`
} else {
menuCont.Component = "public/index" //组件路径(vue页面完整路径,省略.vue后缀)"`
}
} else {
menuCont.Component = requestData.Component //组件路径(vue页面完整路径,省略.vue后缀)"`
}
menuCont.Perm = publicmethod.GetUUid(3) //权限标识"`
menuCont.Visible = requestData.Visible //显示状态(1:显示;2:隐藏,3:删除)"`
menuCont.Sort = requestData.Sort //排序(数字越小排名越靠前))"`
menuCont.Icon = requestData.Icon //菜单图标"`
if types != 1 {
menuCont.Redirect = requestData.Redirect //跳转路径"`
}
menuCont.ParentId = requestData.ParentId //父菜单ID"`
menuCont.Time = time.Now().Unix() //创建时间"`
menuCont.Outside = requestData.Outside //1:内部使用;2:外部使用;3:内外使用"`
err := overall.CONSTANT_DB_AppPlatform.Create(&menuCont).Error
if err != nil {
publicmethod.Result(104, err, c)
return
}
publicmethod.Result(0, err, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-23 16:21:32
@ 功能: 查看菜单
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GetOneMenuCont(c *gin.Context) {
var requestData publicmethod.PublicId
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Id == "" {
publicmethod.Result(1, requestData, c, "未知菜单!")
return
}
var menuCont modelAppPlatform.Menus
err = menuCont.GetCont(map[string]interface{}{"`id`": requestData.Id})
if err != nil {
publicmethod.Result(107, err, c)
return
}
var sendCont EditMenuCont
sendCont.Id = menuCont.Id
sendCont.ParentId = menuCont.ParentId //父菜单ID
sendCont.Name = menuCont.Name //菜单名称
sendCont.Visible = menuCont.Visible //菜单是否可见(1:是;2:否;)
sendCont.Icon = menuCont.Icon //菜单图标
sendCont.Sort = menuCont.Sort //排序
sendCont.Component = menuCont.Component //组件路径
sendCont.Path = menuCont.Path //路由路径
sendCont.Redirect = menuCont.Redirect //跳转路由路径
sendCont.Types = publicmethod.MenuType(menuCont.Types) //菜单类型
sendCont.Outside = menuCont.Outside
publicmethod.Result(0, sendCont, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-23 16:44:14
@ 功能: 修改菜单
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) EditMenusCont(c *gin.Context) {
var requestData EditMenuCont
c.ShouldBindJSON(&requestData)
if requestData.Id == 0 {
publicmethod.Result(1, requestData, c, "未知菜单!")
return
}
if requestData.Name == "" {
publicmethod.Result(1, requestData, c, "请输入菜单名称!")
return
}
if requestData.Visible == 0 {
requestData.Visible = 1
}
if requestData.Sort == 0 {
requestData.Sort = 50
}
if requestData.Outside == 0 {
requestData.Outside = 1
}
whe := publicmethod.MapOut[string]()
whe["`id`"] = requestData.Id
var menuCont modelAppPlatform.Menus
err := menuCont.GetCont(whe)
if err != nil {
publicmethod.Result(107, err, c)
return
}
editCont := publicmethod.MapOut[string]()
if requestData.Name != menuCont.Name {
editCont["name"] = requestData.Name
}
types := publicmethod.MenuTypeToInt(requestData.Types)
if types != menuCont.Types {
editCont["type"] = types
}
if requestData.Path != menuCont.Path {
editCont["path"] = requestData.Path
}
if requestData.Component != menuCont.Component {
if types != menuCont.Types && types == 2 {
if requestData.ParentId != 0 {
editCont["component"] = "public/index"
} else {
editCont["component"] = "Layout"
}
} else {
editCont["component"] = requestData.Component
}
}
if requestData.Visible == 0 {
requestData.Visible = 1
}
if requestData.Visible != menuCont.Visible {
editCont["visible"] = requestData.Visible
}
if requestData.Sort == 0 {
requestData.Sort = 50
}
if requestData.Sort != menuCont.Sort {
editCont["sort"] = requestData.Sort
}
if requestData.Icon != menuCont.Icon {
editCont["icon"] = requestData.Icon
}
if requestData.Redirect != menuCont.Redirect {
editCont["redirect"] = requestData.Redirect
}
if requestData.ParentId != menuCont.ParentId {
editCont["parentId"] = requestData.ParentId
}
if len(editCont) > 0 {
editCont["time"] = time.Now().Unix()
}
if requestData.Outside != menuCont.Outside {
editCont["outside"] = requestData.Outside
}
err = menuCont.EiteCont(whe, editCont)
if err != nil {
publicmethod.Result(106, err, c)
return
}
publicmethod.Result(0, err, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-24 10:33:12
@ 功能: 删除菜单
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) DeltMenusCont(c *gin.Context) {
var requestData publicmethod.PublicId
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Id == "" {
publicmethod.Result(1, requestData, c, "未知菜单!")
return
}
var menuCont modelAppPlatform.Menus
err = menuCont.GetCont(map[string]interface{}{"`id`": requestData.Id})
if err != nil {
publicmethod.Result(107, err, c)
return
}
editCont := publicmethod.MapOut[string]()
editCont["`visible`"] = 3
editCont["`time`"] = time.Now().Unix()
err = menuCont.EiteCont(map[string]interface{}{"`id`": requestData.Id}, editCont)
if err != nil {
publicmethod.Result(106, err, c)
return
}
var sunMenus GetSunMenus
sunMenus.GetSunMenusList(menuCont.Id)
if len(sunMenus.Id) > 0 {
overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.Menus{}).Where("`id` IN ?", sunMenus.Id).Updates(editCont)
}
publicmethod.Result(0, err, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2023-05-24 10:52:12
@ 功能: 获取所有子菜单
@ 参数
#superior 上级菜单Id
@ 返回值
#
@ 方法原型
#func (g *GetSunMenus) GetSunMenusList(superior int)
*/
func (g *GetSunMenus) GetSunMenusList(superior int) {
var menuId []int
err := overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.Menus{}).Select("`id`").Where("`visible` IN (1,2) AND `parentId` = ?", superior).Find(&menuId).Error
if err != nil {
return
}
if len(menuId) > 0 {
for _, v := range menuId {
if !publicmethod.IsInTrue[int](v, g.Id) {
g.Id = append(g.Id, v)
}
g.GetSunMenusList(v)
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-15 14:33:47
@ 功能: 根据角色获取行政组织
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) AccordRoleGiveOrg(c *gin.Context) {
context, _ := c.Get(overall.MyContJwt)
var userMyCont modelshr.ManCont
userMyCont.GetLoginCont(context) //当前操作人
var userCont MyLookOrg
userCont.myInfo = userMyCont
fmt.Printf("起始入口===>%v\n", userMyCont)
syncSeting.Add(1)
go userCont.RoleLookOrg() //角色
syncSeting.Add(1)
go userCont.PostLookOrg() //职位岗位
syncSeting.Add(1)
go userCont.PeopleIsCharge() //是不是部门负责人,获取其负责范围
syncSeting.Wait()
maxLevel := 1
for _, v := range userCont.Level {
if v >= maxLevel {
maxLevel = v
}
}
powerOrgId := publicmethod.RemoveDuplicate[int64](userCont.OrdId)
var orgTree []RolePostIsChnature
sendData := publicmethod.MapOut[string]()
if len(powerOrgId) > 0 {
var orgList []modelshr.AdministrativeOrganization
overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Where("`state` = 1 AND `id` IN ?", powerOrgId).Find(&orgList)
switch maxLevel {
case 2:
orgTree = GovOrgTree(userMyCont.MainDeparment, orgList)
case 3:
orgTree = GovOrgTree(userMyCont.Company, orgList)
case 4:
orgTree = GovOrgTree(313, orgList)
case 5:
orgTree = GovOrgTree(313, orgList)
default:
orgTree = GovOrgTree(userMyCont.AdminOrg, orgList)
}
sendData["companyName"] = gainOrgName(userMyCont.Company, orgList)
sendData["maindeparmentName"] = gainOrgName(userMyCont.MainDeparment, orgList)
sendData["orgName"] = gainOrgName(userMyCont.AdminOrg, orgList)
}
sendData["orgTree"] = orgTree
sendData["company"] = userMyCont.Company
sendData["maindeparment"] = userMyCont.MainDeparment
sendData["orgId"] = userMyCont.AdminOrg
publicmethod.Result(0, sendData, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-16 10:22:46
@ 功能: 获取行政组织名称
*/
func gainOrgName(orgId int64, orgAry []modelshr.AdministrativeOrganization) (orgName string) {
for _, v := range orgAry {
if v.Id == orgId {
orgName = v.Name
return
}
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-16 08:57:31
@ 功能: 生成行政组织树
*/
func GovOrgTree(parentId int64, govList []modelshr.AdministrativeOrganization) (govMap []RolePostIsChnature) {
for i := 0; i < len(govList); i++ {
if govList[i].Superior == parentId {
var govCont RolePostIsChnature
govCont.Id = govList[i].Id
govCont.Number = govList[i].Number //行政编码"`
govCont.Name = govList[i].Name //组织名称"`
govCont.Superior = govList[i].Superior //上级ID"`
govCont.OrganizationType = govList[i].OrganizationType //行政组织类型"`
govCont.Abbreviation = govList[i].Abbreviation //行政组织简称"`
govCont.Time = govList[i].Time //创建时间"`
govCont.State = govList[i].State //状态(1:启用;2:禁用;3:删除)"`
govCont.WechatOrganizationId = govList[i].WechatOrganizationId //微信组织架构对照码"`
govCont.SuperiorSun = govList[i].SuperiorSun //级联ID"`
govCont.Schoole = govList[i].Schoole //原知行学院对照码"`
govCont.KingdeeId = govList[i].KingdeeId //金蝶对照ID"`
govCont.IsPower = govList[i].IsPower //是否为实权部门"`
govCont.Sort = govList[i].Sort //是否为实权部门"`
govCont.Child = GovOrgTree(govList[i].Id, govList)
govMap = append(govMap, govCont)
}
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-16 08:17:34
@ 功能: 判断是不是部门负责人,获取其负责范围
*/
func (m *MyLookOrg) PeopleIsCharge() {
defer syncSeting.Done()
if m.myInfo.PersonInCharge == 1 {
if m.myInfo.ResponsibleDepartment != "" {
resDepAry := strings.Split(m.myInfo.ResponsibleDepartment, ",")
if len(resDepAry) > 0 {
for _, v := range resDepAry {
vInt, _ := strconv.ParseInt(v, 10, 64)
m.OrdId = append(m.OrdId, vInt)
}
}
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-15 16:55:29
@ 功能: 根据岗位
*/
func (m *MyLookOrg) PostLookOrg() {
defer syncSeting.Done()
if m.myInfo.Position != 0 {
var postEmpower modelssystempermission.Empower
overall.CONSTANT_DB_System_Permission.Where("`state` = 1 AND `system` = ? AND `post_id` = ?", "appsystem", m.myInfo.Position).First(&postEmpower)
var managementScope []string //管理范围
if postEmpower.Organization != "" {
orgAry := strings.Split(postEmpower.Organization, ",")
if len(orgAry) > 0 {
for _, ov := range orgAry {
managementScope = append(managementScope, ov)
}
}
}
if len(managementScope) > 0 {
for _, v := range managementScope {
vInt, _ := strconv.ParseInt(v, 10, 64)
m.OrdId = append(m.OrdId, vInt)
}
}
m.Level = append(m.Level, postEmpower.Level)
}
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-15 15:46:45
@ 功能: 根据角色权限获取可见行政组织
*/
func (m *MyLookOrg) RoleLookOrg() {
defer syncSeting.Done()
if m.myInfo.Role != "" {
roleAry := strings.Split(m.myInfo.Role, ",")
if len(roleAry) > 0 {
var managementScope []string //管理范围
var maxLevel int //最大授权等级
var roleEmpower []modelssystempermission.RoleEmpower
overall.CONSTANT_DB_System_Permission.Model(&modelssystempermission.RoleEmpower{}).Where("`state` = 1 AND `system` = ? AND `role_id` IN ?", "appsystem", roleAry).First(&roleEmpower)
for _, v := range roleEmpower {
if v.Level >= maxLevel {
maxLevel = v.Level
}
if v.Organization != "" {
orgAry := strings.Split(v.Organization, ",")
if len(orgAry) > 0 {
for _, ov := range orgAry {
managementScope = append(managementScope, ov)
}
}
}
}
m.Level = append(m.Level, maxLevel)
switch maxLevel {
case 2: //本部门及下级单位
if m.myInfo.MainDeparment != 0 {
var sunOrg publicmethod.GetOrgAllParent
sunOrg.GetOrgSun(m.myInfo.MainDeparment)
sunOrg.Id = append(sunOrg.Id, m.myInfo.MainDeparment)
for _, v := range sunOrg.Id {
if v != 0 {
m.OrdId = append(m.OrdId, v)
}
}
}
case 3: //本分部及其下级
if m.myInfo.Company != 0 {
var sunOrg publicmethod.GetOrgAllParent
sunOrg.GetOrgSun(m.myInfo.Company)
sunOrg.Id = append(sunOrg.Id, m.myInfo.Company)
for _, v := range sunOrg.Id {
if v != 0 {
m.OrdId = append(m.OrdId, v)
}
}
}
case 4: //指定行政组织
for _, v := range managementScope {
vInt, _ := strconv.ParseInt(v, 10, 64)
if vInt != 0 {
m.OrdId = append(m.OrdId, vInt)
}
}
case 5: //所有
var ordidList []int64
overall.CONSTANT_DB_HR.Model(&modelshr.AdministrativeOrganization{}).Select("`id`").Where("`state` = 1").Find(&ordidList)
if len(ordidList) > 0 {
for _, v := range ordidList {
if v != 0 {
m.OrdId = append(m.OrdId, v)
}
}
}
default: //本岗位及下级
if m.myInfo.AdminOrg != 0 {
var sunOrg publicmethod.GetOrgAllParent
sunOrg.GetOrgSun(m.myInfo.AdminOrg)
sunOrg.Id = append(sunOrg.Id, m.myInfo.AdminOrg)
for _, v := range sunOrg.Id {
if v != 0 {
m.OrdId = append(m.OrdId, v)
}
}
}
}
}
}
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-16 15:37:43
@ 功能: 获取排班制度及周期源点
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GainShiftRules(c *gin.Context) {
var requestData publicmethod.PublicId
err := c.ShouldBindJSON(&requestData)
if err != nil {
publicmethod.Result(100, err, c)
return
}
if requestData.Id == "" {
publicmethod.Result(1, requestData, c, "未知菜单!")
return
}
// var menuCont GenesInfo
// err = menuCont.GetCont(map[string]interface{}{"`orgId`": requestData.Id})
orgId, _ := strconv.ParseInt(requestData.Id, 10, 64)
menuCont, _, err := CureeRunRules(orgId)
if err != nil {
publicmethod.Result(200, err, c)
return
}
menuCont.TypeIdStr = strconv.FormatInt(menuCont.TypeId, 10)
// menuCont.StartTimeStr
menuCont.BegainTime = publicmethod.UnixTimeToDay(menuCont.StartTime, 14)
//获取倒班规则
var paiBanType modelshr.WorkTimeType
paiBanType.GetCont(map[string]interface{}{"`id`": menuCont.TypeId}, " `name`")
menuCont.TypeName = paiBanType.Name
//获取源点起始工作时间段
var startWorkTime modelshr.WorkingTimePeriod
startWorkTime.GetCont(map[string]interface{}{"`id`": menuCont.PeriodId}, " `name`")
menuCont.PeriodName = startWorkTime.Name
//获取起始源点起始班组
var starTeam modelshr.PollingRules
starTeam.GetCont(map[string]interface{}{"`id`": menuCont.Rules}, " `teamname`", " `sort`")
menuCont.RulesTime = fmt.Sprintf("%v(%v)", starTeam.TeamName, starTeam.Sort)
publicmethod.Result(0, menuCont, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-16 16:26:39
@ 功能: 确定当前行政组织用哪一个轮询规则
*/
func CureeRunRules(orgId int64) (rules GenesInfo, cureeOrgId int64, err error) {
if orgId != 0 {
err = rules.GetCont(map[string]interface{}{"`orgId`": orgId})
if err != nil || rules.TypeId == 0 {
var supaerOrgId modelshr.AdministrativeOrganization
supaerOrgId.GetCont(map[string]interface{}{"`id`": orgId}, "`superior`")
if supaerOrgId.Superior != 0 {
return CureeRunRules(supaerOrgId.Superior)
}
} else {
cureeOrgId = orgId
}
} else {
err = errors.New("没有相关设定")
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-17 10:12:34
@ 功能: 获取排班类别及轮询制度
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) GainTemsTypeAndRuler(c *gin.Context) {
var workTypeList []modelshr.WorkTimeType
overall.CONSTANT_DB_HR.Model(&modelshr.WorkTimeType{}).Where("`state` = 1").Find(&workTypeList)
var sendList []SendTemsTypeAndRuler
for _, v := range workTypeList {
var sendInfo SendTemsTypeAndRuler
sendInfo.Id = strconv.FormatInt(v.Id, 10)
sendInfo.Name = v.Name
sendInfo.WorkingTimePeriod = GainWorkTimePer(v.Id)
sendInfo.PollingRules = GainPolingRules(v.Id)
sendList = append(sendList, sendInfo)
}
publicmethod.Result(0, sendList, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-17 10:31:52
@ 功能: 获取工作时段
*/
func GainPolingRules(id int64) (timeRulesList []RulerPublicInfo) {
var timeRules []modelshr.PollingRules
overall.CONSTANT_DB_HR.Model(&modelshr.PollingRules{}).Where("`state` = 1 AND `type_id` = ?", id).Order("sort ASC").Find(&timeRules)
for _, v := range timeRules {
var timeRulesInfo RulerPublicInfo
timeRulesInfo.Id = strconv.FormatInt(v.Id, 10)
timeRulesInfo.Name = v.TeamName
timeRulesInfo.Sort = v.Sort
timeRulesList = append(timeRulesList, timeRulesInfo)
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-17 10:31:52
@ 功能: 获取工作时段
*/
func GainWorkTimePer(id int64) (timePeriodList []RulerPublicInfo) {
var timePeriod []modelshr.WorkingTimePeriod
overall.CONSTANT_DB_HR.Model(&modelshr.WorkingTimePeriod{}).Where("`state` = 1 AND `type_id` = ?", id).Order("sort ASC").Find(&timePeriod)
for _, v := range timePeriod {
var timePerInfo RulerPublicInfo
timePerInfo.Id = strconv.FormatInt(v.Id, 10)
timePerInfo.Name = v.Name
timePerInfo.Sort = v.Sort
timePerInfo.StartTime = v.StartTime
timePerInfo.EndTime = v.EndTime
timePeriodList = append(timePeriodList, timePerInfo)
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-17 18:10:05
@ 功能: 解析日历生成排班顺序
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func (a *ApiMethod) AnalysisMonthRulers(c *gin.Context) {
var requestData AnYuePaiBan
c.ShouldBindJSON(&requestData)
// err := c.ShouldBindJSON(&requestData)
// if err != nil {
// publicmethod.Result(100, requestData, c)
// return
// }
if requestData.OrgId == "" {
publicmethod.Result(1, requestData, c, "未知行政单位")
return
}
var sendMonthList []interface{}
orgIdInt, _ := strconv.ParseInt(requestData.OrgId, 10, 64)
menuCont, cureeOrgId, err := CureeRunRules(orgIdInt)
if err != nil {
// for _, v := range requestData.MonthAllDay {
// var listSynv CalendarList
// sendMonthList = append(sendMonthList, TimeHaveAry(v, listSynv.List))
// }
publicmethod.Result(200, sendMonthList, c)
return
}
isRedisTrue := true
//Step 1:查看当前提交时间Redis中是否已经排班
for _, v := range requestData.MonthAllDay {
weekIsRedisTrue := false
var vDay []CalendarStructure
for _, wv := range v {
var wvTimeAll publicmethod.DateTimeTotimes
wvTimeAll.BaisStrToTime(wv.Date)
dayRedisKey := fmt.Sprintf("SchedulingTeam:Org_%v_%v_%v_%v", cureeOrgId, wvTimeAll.Years, wvTimeAll.Months, wvTimeAll.Days)
redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2)
isOk, dayRedisVal := redisClient.Get(dayRedisKey)
if isOk {
var vDayInfo CalendarStructure
redisJsonErr := json.Unmarshal([]byte(dayRedisVal), &vDayInfo)
if redisJsonErr == nil {
vDay = append(vDay, vDayInfo)
}
weekIsRedisTrue = true
}
}
isRedisTrue = weekIsRedisTrue
if weekIsRedisTrue {
sendMonthList = append(sendMonthList, vDay)
}
//
}
if isRedisTrue {
publicmethod.Result(0, sendMonthList, c)
return
}
//Step 2:若redis中没有响应数据,那么进行数据查询
// isDatabaseTrue := true
// for _, v := range requestData.MonthAllDay {
// weekIsDatabaseTrue := false
// var vDay []CalendarStructure
// for _, wv := range v {
// var wvTimeAll publicmethod.DateTimeTotimes
// wvTimeAll.BaisStrToTime(wv.Date)
// var teamLogList teamlog.TeamsLog
// teamLogList.GetCont(map[string]interface{}{"`orgId`": cureeOrgId, "`years`": wvTimeAll.Years, "`months`": wvTimeAll.Months, "`days`": wvTimeAll.Days, "`ismId`": menuCont.TypeId, "`rulesId`": menuCont.Rules})
// if teamLogList.Id != 0 {
// weekIsDatabaseTrue = true
// var vDayInfo CalendarStructure
// vDayInfo.List = teamLogList
// vDay = append(vDay, vDayInfo)
// jsonVal, _ := json.Marshal(vDayInfo)
// dayRedisKey := fmt.Sprintf("SchedulingTeam:Org_%v_%v_%v_%v", cureeOrgId, wvTimeAll.Years, wvTimeAll.Months, wvTimeAll.Days)
// redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2)
// redisClient.SetRedisTime(5256000)
// redisClient.Set(dayRedisKey, string(jsonVal))
// }
// }
// isDatabaseTrue = weekIsDatabaseTrue
// if weekIsDatabaseTrue {
// sendMonthList = append(sendMonthList, vDay)
// }
// }
// if isDatabaseTrue {
// publicmethod.Result(0, sendMonthList, c)
// return
// }
//Step 3:若redis和数据库中都没有相应数据,那么根据数据源点进行计算
//获取源点起始工作时间段
menuCont.BegainTime = publicmethod.UnixTimeToDay(menuCont.StartTime, 14)
menuCont.TypeIdStr = strconv.FormatInt(menuCont.TypeId, 10)
//获取倒班规则
var paiBanType modelshr.WorkTimeType
paiBanType.GetCont(map[string]interface{}{"`id`": menuCont.TypeId}, " `name`")
menuCont.TypeName = paiBanType.Name
var starTeam modelshr.PollingRules
starTeam.GetCont(map[string]interface{}{"`id`": menuCont.Rules}, " `teamname`", " `sort`")
menuCont.RulesName = starTeam.TeamName
menuCont.RulesSort = starTeam.Sort
var wtpInfo modelshr.WorkingTimePeriod
wtpInfo.GetCont(map[string]interface{}{"`id`": menuCont.PeriodId}, " `name`", " `sort`", "`start_time` ", "`end_time`")
menuCont.PeriodName = fmt.Sprintf("%v(%v - %v)", wtpInfo.Name, wtpInfo.StartTime, wtpInfo.EndTime)
//作息时间
var zuoXiTime []modelshr.WorkingTimePeriod
overall.CONSTANT_DB_HR.Model(&modelshr.WorkingTimePeriod{}).Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").Find(&zuoXiTime)
//轮询时序
var lunXunShiXu []modelshr.PollingRules
overall.CONSTANT_DB_HR.Model(&modelshr.PollingRules{}).Where("`state` = 1 AND `type_id` = ?", menuCont.TypeId).Order("`sort` ASC").Find(&lunXunShiXu)
if len(zuoXiTime) < 1 || len(lunXunShiXu) < 1 {
for _, v := range requestData.MonthAllDay {
var listSynv CalendarList
sendMonthList = append(sendMonthList, TimeHaveAry(v, listSynv.List))
}
publicmethod.Result(200, sendMonthList, c)
return
}
//Step 4: 计算当前时间段与原点关系
lastDayNumber := 0
var starTemasTime publicmethod.DateTimeTotimes
starTemasTime.BaisStrToTime(menuCont.BegainTime)
for _, v := range requestData.MonthAllDay {
var listSynv CalendarList
for _, wv := range v {
var wvTimeAll publicmethod.DateTimeTotimes
wvTimeAll.BaisStrToTime(wv.Date)
sjc := wvTimeAll.AllTime - starTemasTime.AllTime
fmt.Printf("%v - %v - %v 时间差:%v\n", wv.Date, wvTimeAll.AllTime, starTemasTime.AllTime, sjc)
if sjc >= 0 {
if sjc == 0 {
listAry := menuCont.TeamsYuanDianRun(wv, wvTimeAll, zuoXiTime, lunXunShiXu)
inDate := publicmethod.MapOut[string]()
inDate[wv.Date] = listAry
listSynv.List = append(listSynv.List, inDate)
} else {
listAry := menuCont.TeamsRun(wv, wvTimeAll, zuoXiTime, lunXunShiXu)
inDate := publicmethod.MapOut[string]()
inDate[wv.Date] = listAry
listSynv.List = append(listSynv.List, inDate)
}
} else {
lastDayNumber++
}
}
sendMonthList = append(sendMonthList, TimeHaveAry(v, listSynv.List))
}
// cureeTime := publicmethod.UnixTimeToDay(time.Now().Unix(), 14)
// if requestData.MonthAllDay[0][0].Date != "" {
// cureeTime = requestData.MonthAllDay[0][0].Date
// }
// var creTimeAll publicmethod.DateTimeTotimes
// creTimeAll.BaisStrToTime(cureeTime)
//获取上个月最后一天
// lastMonthStart, lastMonthEnd := publicmethod.GetLastMonthStartEnd(creTimeAll.AllTimeString)
publicmethod.Result(0, sendMonthList, c)
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-18 09:26:03
@ 功能: 解析排班规则(当天是原点)
@ 参数
#dataInfo 当前日期属性
#timeVal 当前时间
#zuoXiTime 作息时间段
#lunXunShiXu 轮询规则
*/
func (g *GenesInfo) TeamsYuanDianRun(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.PollingRules) (logMap []map[string]interface{}) {
// var logList []teamlog.TeamsLog
dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v_%v_%v", g.OrgId, g.TypeId, g.PeriodId, g.Rules)
redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2)
isTrue, logContent := redisClient.Get(dayRedisKey)
var logInfo teamlog.TeamsLog
if isTrue {
json.Unmarshal([]byte(logContent), &logInfo)
valMap := publicmethod.MapOut[string]()
json.Unmarshal([]byte(logContent), &valMap)
// valueOfExample := reflect.ValueOf(logInfo)
// if valueOfExample.Kind() == reflect.Struct {
// for i := 0; i < valueOfExample.NumField(); i++ {
// valMap[valueOfExample.Type().Field(i).Name] = valueOfExample.Field(i).Interface()
// }
// }
// logList = append(logList, logInfo)
logMap = append(logMap, valMap)
allRulesLog = logInfo
} else {
logInfo.OrgId = g.OrgId //班组ID"`
logInfo.TeamsTime = timeVal.AllTime //日期"`
logInfo.IsmId = g.TypeId //制度ID"`
logInfo.RankId = g.PeriodId //班次"`
logInfo.RulesId = g.Rules //轮询规则Id"`
logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"`
logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"`
logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"`
logInfo.Time = time.Now().Unix() //编辑时间"`
logInfo.IsmName = g.TypeName
logInfo.RankName = g.PeriodName
logInfo.RulesName = g.RulesTime
logInfo.Sort = g.RulesSort
logInfo.TeamsId = g.Rules
overall.CONSTANT_DB_TeamsLog.Create(&logInfo)
// logList = append(logList, logInfo)
allRulesLog = logInfo
redisClient.SetRedisTime(5256000)
jsonVal, _ := json.Marshal(logInfo)
redisClient.Set(dayRedisKey, string(jsonVal))
valMap := publicmethod.MapOut[string]()
json.Unmarshal(jsonVal, &valMap)
logMap = append(logMap, valMap)
}
return
}
/*
*
@ 作者: 秦东
@ 时间: 2025-01-18 09:26:03
@ 功能: 解析排班规则
@ 参数
#dataInfo 当前日期属性
#timeVal 当前时间
#zuoXiTime 作息时间段
#lunXunShiXu 轮询规则
*/
func (g *GenesInfo) TeamsRun(dataInfo CalendarStructure, timeVal publicmethod.DateTimeTotimes, zuoXiTime []modelshr.WorkingTimePeriod, lunXunShiXu []modelshr.PollingRules) (logMap []map[string]interface{}) {
// var logList []teamlog.TeamsLog
if len(zuoXiTime) < 1 && len(lunXunShiXu) < 1 {
return
} else if len(zuoXiTime) == 1 && len(lunXunShiXu) == 1 {
if dataInfo.IsWorks {
for _, v := range zuoXiTime {
var logInfo teamlog.TeamsLog
logInfo.OrgId = g.OrgId //班组ID"`
logInfo.TeamsTime = timeVal.AllTime //日期"`
logInfo.IsmId = g.TypeId //制度ID"`
logInfo.RankId = v.Id //班次"`
logInfo.RulesId = 0 //轮询规则Id"`
logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"`
logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"`
logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"`
logInfo.Time = time.Now().Unix() //编辑时间"`
logInfo.IsmName = g.TypeName
logInfo.RankName = fmt.Sprintf("%v(%v - %v)", v.Name, v.StartTime, v.EndTime) //v.Name
logInfo.RulesName = "休"
logInfo.TeamsId = 0
logInfo.Sort = 0
// logList = append(logList, logInfo)
jsonVal, _ := json.Marshal(logInfo)
valMap := publicmethod.MapOut[string]()
json.Unmarshal(jsonVal, &valMap)
logMap = append(logMap, valMap)
}
} else {
for _, v := range zuoXiTime {
var logInfo teamlog.TeamsLog
logInfo.OrgId = g.OrgId //班组ID"`
logInfo.TeamsTime = timeVal.AllTime //日期"`
logInfo.IsmId = g.TypeId //制度ID"`
logInfo.RankId = v.Id //班次"`
logInfo.RulesId = zuoXiTime[0].Id //轮询规则Id"`
logInfo.Days, _ = strconv.Atoi(timeVal.Years) //日"`
logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"`
logInfo.Years, _ = strconv.Atoi(timeVal.Days) //年"`
logInfo.Time = time.Now().Unix() //编辑时间"`
logInfo.IsmName = g.TypeName
logInfo.RankName = fmt.Sprintf("%v(%v - %v)", v.Name, v.StartTime, v.EndTime) //v.Name
logInfo.RulesName = lunXunShiXu[0].TeamName
logInfo.TeamsId = lunXunShiXu[0].Teamid
logInfo.Sort = lunXunShiXu[0].Sort
// logList = append(logList, logInfo)
jsonVal, _ := json.Marshal(logInfo)
valMap := publicmethod.MapOut[string]()
json.Unmarshal(jsonVal, &valMap)
logMap = append(logMap, valMap)
}
}
} else {
//判断轮询规制(是两天一换还是一天一换)
var lunXunChuchong []int64
maxSort := 0 //最大排序
for _, v := range lunXunShiXu {
if !publicmethod.IsInTrue[int64](v.Teamid, lunXunChuchong) {
lunXunChuchong = append(lunXunChuchong, v.Teamid)
}
if maxSort <= v.Sort {
maxSort = v.Sort
}
}
//基于上个日期班组定位顺序
lastStep := 0
startStep := 0 //起始步伐
workTimeNum := len(zuoXiTime) //一天拍几个班
for _, v := range zuoXiTime {
if allRulesLog.RankId == v.Id {
lastStep = len(zuoXiTime) - v.Sort
startStep = v.Sort
}
}
if startStep <= 0 {
startStep = 1
}
beiChuShu := 1
if len(lunXunChuchong) > 0 {
beiChuShu = len(lunXunChuchong)
}
yuanDianDay := fmt.Sprintf("%v-%v-%v", allRulesLog.Years, allRulesLog.Months, allRulesLog.Days)
xiangChaJitian, err := publicmethod.DayBetweenDate(dataInfo.Date, yuanDianDay) //与上一个排班相差几天
if err != nil {
xiangChaJitian = 1
}
switch len(lunXunShiXu) / beiChuShu {
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
default:
dayRedisKey := fmt.Sprintf("SchedulingTeam:StartingPoint_%v_%v_%v_%v", g.OrgId, g.TypeId, g.PeriodId, g.Rules)
redisClient := grocerystore.RunRedis(overall.CONSTANT_REDIS2)
stepAll := xiangChaJitian*workTimeNum + lastStep //一共要走的步数
for i := 1; i <= stepAll; i++ {
startStep++
if startStep > workTimeNum {
startStep = 1
}
// for _, zv := range zuoXiTime {
if i > lastStep {
for _, v := range lunXunShiXu {
if v.Sort == startStep {
fmt.Printf("")
workInfoDuan := PaiBanSunXu(startStep, zuoXiTime)
var logInfo teamlog.TeamsLog
logInfo.GetCont(map[string]interface{}{"`orgId`": g.OrgId, "`years`": timeVal.Years, "`months`": timeVal.Months, "`days`": timeVal.Days, "`ismId`": g.TypeId, "`rulesId`": g.PeriodId, "`teamsId`": v.Teamid})
if logInfo.Id != 0 {
editInfo := publicmethod.MapOut[string]()
editInfo["rulesName"] = v.TeamName
editInfo["time"] = time.Now().Unix()
logInfo.EiteCont(map[string]interface{}{"`id`": logInfo.Id}, editInfo)
// logList = append(logList, logInfo)
jsonVal, _ := json.Marshal(logInfo)
valMap := publicmethod.MapOut[string]()
json.Unmarshal(jsonVal, &valMap)
logMap = append(logMap, valMap)
redisClient.SetRedisTime(5256000)
// jsonVal, _ := json.Marshal(logInfo)
redisClient.Set(dayRedisKey, string(jsonVal))
} else {
logInfo.OrgId = g.OrgId //班组ID"`
logInfo.TeamsTime = timeVal.AllTime //日期"`
logInfo.IsmId = g.TypeId //制度ID"`
logInfo.RankId = workInfoDuan.Id //g.PeriodId //班次"`
logInfo.RulesId = g.Rules //轮询规则Id"`
logInfo.Days, _ = strconv.Atoi(timeVal.Days) //日"`
logInfo.Months, _ = strconv.Atoi(timeVal.Months) //月"`
logInfo.Years, _ = strconv.Atoi(timeVal.Years) //年"`
logInfo.Time = time.Now().Unix() //编辑时间"`
logInfo.IsmName = g.TypeName
logInfo.RankName = fmt.Sprintf("%v(%v - %v)", workInfoDuan.Name, workInfoDuan.StartTime, workInfoDuan.EndTime) //workInfoDuan.Name //g.PeriodName
logInfo.RulesName = v.TeamName
logInfo.TeamsId = v.Teamid
logInfo.Sort = g.RulesSort
overall.CONSTANT_DB_TeamsLog.Create(&logInfo)
// logList = append(logList, logInfo)
jsonVal, _ := json.Marshal(logInfo)
valMap := publicmethod.MapOut[string]()
json.Unmarshal(jsonVal, &valMap)
logMap = append(logMap, valMap)
redisClient.SetRedisTime(5256000)
// jsonVal, _ := json.Marshal(logInfo)
redisClient.Set(dayRedisKey, string(jsonVal))
}
}
}
}
// }
}
}
}
return
}
// 获取排班顺序
func PaiBanSunXu(step int, zuoXiTime []modelshr.WorkingTimePeriod) (zxsj modelshr.WorkingTimePeriod) {
for _, v := range zuoXiTime {
if v.Sort == step {
zxsj = v
return
}
}
return
}
/**
@ 作者: 秦东
@ 时间: 2025-01-17 19:42:50
@ 功能: 获取上个月最后一天
*/
/*
*
@ 作者: 秦东
@ 时间: 2024-07-17 08:55:56
@ 功能: 结果与日期合并
@ 参数
#
@ 返回值
#
@ 方法原型
#
*/
func TimeHaveAry(dateList []CalendarStructure, listDate []map[string]interface{}) []CalendarStructure {
for ti, tv := range dateList {
// fmt.Printf("测试类型--->%v=============>%v\n", ti, tv)
for _, v := range listDate {
for mi, mv := range v {
// fmt.Printf("测试类型--2->%v=============>%v\n", tv.Date, mi)
if tv.Date == mi {
// fmt.Printf("测试类型--1->%v=============>%v\n", tv.Date, mi)
dateList[ti].List = mv
}
}
}
}
return dateList
}