package controllers

import (
	"fmt"
	"github.com/jinzhu/gorm"
	"strconv"
	"strings"
	"time"

	"Xcx_New/enums"
	"Xcx_New/models"
	"Xcx_New/service"

	"github.com/astaxie/beego"
)

func RoleAPIControllerRegistRouters() {
	beego.Router("/api/roles", &RoleAPIController{}, "get:GetRoles")
	beego.Router("/api/role/create", &RoleAPIController{}, "post:CreateRole")
	beego.Router("/api/role/modify", &RoleAPIController{}, "post:ModifyRole")
	beego.Router("/api/role/setstatus", &RoleAPIController{}, "post:ModifyRoleStatus")

	beego.Router("/role/purview/editinit", &RoleAPIController{}, "get:EditPurviewInitData")
	beego.Router("/role/purview/edit", &RoleAPIController{}, "post:EditPurview")

	beego.Router("/api/adminmain", &RoleAPIController{}, "get:AdminMainView")
	beego.Router("/api/admins", &RoleAPIController{}, "get:Admins")
	beego.Router("/api/admin/addinit", &RoleAPIController{}, "get:AddAdminInitData")
	beego.Router("/api/admin/add", &RoleAPIController{}, "get:AddAdmin")
	beego.Router("/api/admin/editinit", &RoleAPIController{}, "get:EditAdminInitData")
	beego.Router("/api/admin/edit", &RoleAPIController{}, "get:EditAdmin")
	beego.Router("/api/admin/setstatus", &RoleAPIController{}, "post:AdminSetStatus")

	beego.Router("/api/admin/specialpermission/initdata", &RoleAPIController{}, "get:SpecialPermissionInitData")
	beego.Router("/api/admin/specialpermission/dialysisrecord/submit", &RoleAPIController{}, "post:SubmitDialysisRecordPermission")

	beego.Router("/api/roles/list", &RoleAPIController{}, "get:GetAllOrgRole")
	beego.Router("/api/staff", &RoleAPIController{}, "get:GetAllOrgUser")
	beego.Router("/api/role/addStaff", &RoleAPIController{}, "post:AddRoleStaff")

	beego.Router("/api/role/staff", &RoleAPIController{}, "get:GetRoleStaff")

	beego.Router("/api/role", &RoleAPIController{}, "get:GetRoleInfo")

}

type RoleAPIController struct {
	BaseAuthAPIController
}

// /api/roles [get]
// @param page?:int
func (this *RoleAPIController) GetRoles() {
	page, _ := this.GetInt("page")
	adminUserInfo := this.GetAdminUserInfo()
	//beego.Alert(adminUserInfo.AdminUser)
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}
	if page <= 0 {
		page = 1
	}
	roles, total, getRoleErr := service.GetRoles(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, page, 100)
	if getRoleErr != nil {
		//beego.Error("获取角色列表失败:", getRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	} else {
		this.ServeSuccessJSON(map[string]interface{}{
			"roles":       roles,
			"total_count": total,
		})
	}
}

// /api/role/create [post]
// @param name:string
// @param intro:string
func (this *RoleAPIController) CreateRole() {
	name := this.GetString("name")
	intro := this.GetString("intro")
	if len(name) == 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	total := service.FindRoleRecordByRoleName(name, adminUserInfo.CurrentOrgId)
	if total > 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRoleNameIsExist)
		return
	}
	role, createErr := service.CreateRole(adminUserInfo.AdminUser.Id, adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, name, intro)
	if createErr != nil {
		//beego.Error("创建角色失败:", createErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBCreate)
	} else {
		this.ServeSuccessJSON(map[string]interface{}{
			"id":     role.Id,
			"name":   role.RoleName,
			"intro":  role.RoleIntro,
			"status": role.Status,
		})
	}
}

// /api/role/modify
// @param role_id:int
// @param name:string
// @param intro:string
func (this *RoleAPIController) ModifyRole() {
	roleID, _ := this.GetInt64("role_id")
	name := this.GetString("name")
	intro := this.GetString("intro")
	if roleID <= 0 || len(name) == 0 || len(intro) == 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	//adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	role, getRoleErr := service.GetRoleByRoleID(roleID)
	if getRoleErr != nil {
		//beego.Error("获取角色失败:", getRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if role == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRoleNotExist)
		return
	}

	role.RoleName = name
	role.RoleIntro = intro
	role.ModifyTime = time.Now().Unix()
	saveErr := service.ModifyRole(role)
	if saveErr != nil {
		//beego.Error("修改角色失败:", role.Id, saveErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)
	} else {
		this.ServeSuccessJSON(nil)
	}
}

// /api/role/setstatus
// @param role_id:int
// @param enable:bool
func (this *RoleAPIController) ModifyRoleStatus() {
	roleID, _ := this.GetInt64("role_id")
	enable, _ := this.GetBool("enable")
	if roleID <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	role, getRoleErr := service.GetRoleByRoleID(roleID)
	if getRoleErr != nil {
		//beego.Error("获取角色失败:", getRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if role == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRoleNotExist)
		return
	}

	if enable == false {
		if count, _ := service.RoleAdminUserCountTwo(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, roleID); count != 0 {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCannotRemoveRole)
			return
		}
	}

	if enable {
		role.Status = 1
	} else {
		role.Status = 2
	}
	role.ModifyTime = time.Now().Unix()
	saveErr := service.ModifyRole(role)
	if saveErr != nil {
		//beego.Error("修改角色失败:", role.Id, saveErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)
	} else {
		this.ServeSuccessJSON(nil)
	}
}

// /role/purview/editinit [get]
// @param role_id:int
func (this *RoleAPIController) EditPurviewInitData() {
	//adminUserInfo := this.GetAdminUserInfo()
	//if
	//}

	roleId, _ := this.GetInt64("role_id")
	if roleId <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	role, _ := service.GetRoleByRoleID(roleId)

	//purviews_xt, getPurviewsErr := service.GetAllGeneralPurviewVMsProcessed(3)
	purviews_scrm, getPurviewsErr := service.GetAllGeneralPurviewVMsProcessed(6)
	purviews_cdm, getPurviewsErr := service.GetAllGeneralPurviewVMsProcessed(4)
	purviews_mall, getPurviewsErr := service.GetAllGeneralPurviewVMsProcessed(7)
	purviews_ky_mall, getPurviewsErr := service.GetAllGeneralPurviewVMsProcessed(8)

	purviews_func, _ := service.GetAllGeneralFuncPurviewVMsProcessed()

	//门诊
	outpatientRegistration, _, _ := service.GetOtherAllGeneralPurviewVMsProcessed("/outpatientRegistration/manage")
	//电子病历
	_, _, originEle := service.GetOtherAllGeneralPurviewVMsProcessed("/patinets/ele")
	//透析管理
	_, _, originDialysis := service.GetOtherAllGeneralPurviewVMsProcessed("/dialysis/manage")
	//库房管理
	_, _, originStock := service.GetOtherAllGeneralPurviewVMsProcessed("/stock/manage")
	//配置管理
	//_, _, orginConfig := service.GetOtherAllGeneralPurviewVMsProcessed("/config/manage")

	//门诊管理
	_, _, outpatientRegistrationPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/outpatientRegistration/index")

	_, _, outpatientRegistrationPurviewTwo := service.GetOtherAllGeneralPurviewVMsProcessed("/outpatientDoctorStation")

	_, _, outpatientRegistrationPurviewThree := service.GetOtherAllGeneralPurviewVMsProcessed("/outpatientCharges")

	_, _, outpatientRegistrationPurviewFour := service.GetOtherAllGeneralPurviewVMsProcessed("/hospitalStation")

	//透析管理
	_, _, originDialysisWatchPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/dialysis/watch")
	_, _, originWorkforcePurview := service.GetOtherAllGeneralPurviewVMsProcessed("/workforce/patient")
	_, _, originSignPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/sign/lineup")
	_, _, originMedicalSchedulingPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/medicalScheduling/index")
	_, _, originQcdPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/qcd/manage")
	_, _, originDevicePurview := service.GetOtherAllGeneralPurviewVMsProcessed("/device/manage")
	_, _, originDataUploadPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/data/upload")

	_, _, originConsumablesPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/stock/consumablesManagement")
	_, _, originDrugsPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/stock/drugs")
	_, _, originSelfPreparedMedicinePurview := service.GetOtherAllGeneralPurviewVMsProcessed("/stock/selfPreparedMedicineIndex")
	_, _, originOtherPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/stock/other")

	_, _, originIntegrationPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/integration/manage")
	_, _, originTemplatePurview := service.GetOtherAllGeneralPurviewVMsProcessed("/template/manage")
	_, _, originDictMedicinePurview := service.GetOtherAllGeneralPurviewVMsProcessed("/dict/manage")
	_, _, originBedPurview := service.GetOtherAllGeneralPurviewVMsProcessed("/bed/manage")

	//门诊管理

	subPurviewTreeViewModel := []*service.PurviewTreeViewModel{}

	subPurviewTreeViewModelTwo := []*service.PurviewTreeViewModel{}
	subPurviewTreeViewModelThree := []*service.PurviewTreeViewModel{}
	subPurviewTreeViewModelFour := []*service.PurviewTreeViewModel{}

	for _, item := range outpatientRegistrationPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subPurviewTreeViewModel = append(subPurviewTreeViewModel, temp)
	}

	for _, item := range outpatientRegistrationPurviewTwo {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subPurviewTreeViewModelTwo = append(subPurviewTreeViewModelTwo, temp)
	}

	for _, item := range outpatientRegistrationPurviewThree {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subPurviewTreeViewModelThree = append(subPurviewTreeViewModelThree, temp)
	}

	for _, item := range outpatientRegistrationPurviewFour {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subPurviewTreeViewModelFour = append(subPurviewTreeViewModelFour, temp)
	}

	for _, item := range outpatientRegistration {
		if item.Name == "门诊挂号" {
			item.Childs = append(item.Childs, subPurviewTreeViewModel...)
		}

		if item.Name == "门诊医生站" {
			item.Childs = append(item.Childs, subPurviewTreeViewModelTwo...)
		}

		if item.Name == "门诊收费" {
			item.Childs = append(item.Childs, subPurviewTreeViewModelThree...)
		}

		if item.Name == "住院工作站" {
			item.Childs = append(item.Childs, subPurviewTreeViewModelFour...)
		}
	}

	//电子病历

	subElePurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originEle {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subElePurviewTreeViewModel = append(subElePurviewTreeViewModel, temp)
	}

	//透析管理
	subDialysisPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originDialysis {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subDialysisPurviewTreeViewModel = append(subDialysisPurviewTreeViewModel, temp)
	}

	//库存管理
	subStockPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originStock {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subStockPurviewTreeViewModel = append(subStockPurviewTreeViewModel, temp)
	}

	////配置管理
	//subConfigPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	//for _, item := range orginConfig {
	//	temp := &service.PurviewTreeViewModel{
	//		ID:     item.Id,
	//		PID:    item.Parentid,
	//		Name:   item.Name,
	//		Number: 1,
	//	}
	//	subConfigPurviewTreeViewModel = append(subConfigPurviewTreeViewModel, temp)
	//}
	//
	//

	//监测管理
	subWatchPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originDialysisWatchPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subWatchPurviewTreeViewModel = append(subWatchPurviewTreeViewModel, temp)
	}

	//排班管理
	subWorkforcePurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originWorkforcePurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subWorkforcePurviewTreeViewModel = append(subWorkforcePurviewTreeViewModel, temp)
	}

	//签到排队
	subSignPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originSignPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subSignPurviewTreeViewModel = append(subSignPurviewTreeViewModel, temp)
	}

	//医护排班
	subMedicalSchedulingPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originMedicalSchedulingPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subMedicalSchedulingPurviewTreeViewModel = append(subMedicalSchedulingPurviewTreeViewModel, temp)
	}

	subQCDPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originQcdPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subQCDPurviewTreeViewModel = append(subQCDPurviewTreeViewModel, temp)
	}

	subDevicePurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originDevicePurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subDevicePurviewTreeViewModel = append(subDevicePurviewTreeViewModel, temp)
	}

	subDataUploadPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originDataUploadPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subDataUploadPurviewTreeViewModel = append(subDataUploadPurviewTreeViewModel, temp)
	}

	subConsumablesPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originConsumablesPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subConsumablesPurviewTreeViewModel = append(subConsumablesPurviewTreeViewModel, temp)
	}

	subDrugPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originDrugsPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subDrugPurviewTreeViewModel = append(subDrugPurviewTreeViewModel, temp)
	}

	subSelfPreparedMedicinePurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originSelfPreparedMedicinePurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subSelfPreparedMedicinePurviewTreeViewModel = append(subSelfPreparedMedicinePurviewTreeViewModel, temp)
	}

	subOtherPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originOtherPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subOtherPurviewTreeViewModel = append(subOtherPurviewTreeViewModel, temp)
	}

	subIntegrationPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originIntegrationPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subIntegrationPurviewTreeViewModel = append(subIntegrationPurviewTreeViewModel, temp)
	}

	subTemplatePurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originTemplatePurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subTemplatePurviewTreeViewModel = append(subTemplatePurviewTreeViewModel, temp)
	}

	subDictPurviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originDictMedicinePurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subDictPurviewTreeViewModel = append(subDictPurviewTreeViewModel, temp)
	}

	subBedPrviewTreeViewModel := []*service.PurviewTreeViewModel{}
	for _, item := range originBedPurview {
		temp := &service.PurviewTreeViewModel{
			ID:     item.Id,
			PID:    item.Parentid,
			Name:   item.Name,
			Number: 1,
		}
		subBedPrviewTreeViewModel = append(subBedPrviewTreeViewModel, temp)
	}

	for _, item := range subDialysisPurviewTreeViewModel {
		if item.Name == "透析记录" {
			item.Childs = append(item.Childs, purviews_func...)
		}
		if item.Name == "透析监控" {
			item.Childs = append(item.Childs, subWatchPurviewTreeViewModel...)
		}
		if item.Name == "患者排班" {
			item.Childs = append(item.Childs, subWorkforcePurviewTreeViewModel...)
		}
		if item.Name == "签到排队" {
			item.Childs = append(item.Childs, subSignPurviewTreeViewModel...)
		}
		if item.Name == "医护排班" {
			item.Childs = append(item.Childs, subMedicalSchedulingPurviewTreeViewModel...)
		}
		if item.Name == "质控管理" {
			item.Childs = append(item.Childs, subQCDPurviewTreeViewModel...)
		}
		if item.Name == "院感管理" {
			item.Childs = append(item.Childs, subDevicePurviewTreeViewModel...)
		}
		if item.Name == "质控上报" {
			item.Childs = append(item.Childs, subDataUploadPurviewTreeViewModel...)
		}
	}

	for _, item := range subStockPurviewTreeViewModel {
		if item.Name == "耗材管理" {
			item.Childs = append(item.Childs, subConsumablesPurviewTreeViewModel...)
		}
		if item.Name == "药库管理" {
			item.Childs = append(item.Childs, subDrugPurviewTreeViewModel...)
		}
		if item.Name == "自备药管理" {
			item.Childs = append(item.Childs, subSelfPreparedMedicinePurviewTreeViewModel...)
		}
		if item.Name == "其他管理" {
			item.Childs = append(item.Childs, subOtherPurviewTreeViewModel...)
		}

	}

	//for _, item := range subConfigPurviewTreeViewModel {
	//	if item.Name == "集成管理" {
	//		item.Childs = append(item.Childs, subIntegrationPurviewTreeViewModel...)
	//	}
	//	if item.Name == "模版管理" {
	//		item.Childs = append(item.Childs, subTemplatePurviewTreeViewModel...)
	//	}
	//	if item.Name == "字典管理" {
	//		item.Childs = append(item.Childs, subDictPurviewTreeViewModel...)
	//	}
	//	if item.Name == "床位管理" {
	//		item.Childs = append(item.Childs, subBedPrviewTreeViewModel...)
	//	}
	//
	//}

	purviews := []*service.PurviewTreeViewModel{}

	menzhen := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "门诊管理",
		Number: 3,
		Childs: outpatientRegistration,
	}
	purviews = append(purviews, menzhen)

	dianzi := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "电子病历",
		Number: 3,
		Childs: subElePurviewTreeViewModel,
	}
	purviews = append(purviews, dianzi)

	touxi := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "透析管理",
		Number: 3,
		Childs: subDialysisPurviewTreeViewModel,
	}
	purviews = append(purviews, touxi)

	kufang := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "库房管理",
		Number: 3,
		Childs: subStockPurviewTreeViewModel,
	}
	purviews = append(purviews, kufang)

	ky_mall := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "酷医商城",
		Number: 3,
		Childs: purviews_ky_mall,
	}
	purviews = append(purviews, ky_mall)

	cdm := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Number: 3,
		Name:   "慢病管理",
		Childs: purviews_cdm,
	}

	purviews = append(purviews, cdm)

	scrm := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "营销管理",
		Number: 3,
		Childs: purviews_scrm,
	}

	purviews = append(purviews, scrm)

	mall := &service.PurviewTreeViewModel{
		ID:     0,
		PID:    0,
		Name:   "分销商城",
		Number: 3,
		Childs: purviews_mall,
	}

	purviews = append(purviews, mall)

	//peizhi := &service.PurviewTreeViewModel{
	//	ID:     0,
	//	PID:    0,
	//	Name:   "配置管理",
	//	Number: 3,
	//	Childs: subConfigPurviewTreeViewModel,
	//}
	//purviews = append(purviews, peizhi)

	if getPurviewsErr != nil {
		//beego.Error("获取所有权限时出错:", getPurviewsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	rolePurviewIdStr, getRPIdsErr := service.GetRolePurviewIds(roleId)
	if getRPIdsErr != nil {
		//beego.Error("获取角色的权限时出错:", getRPIdsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	roleFuncPurview, getFuncRPIdsErr := service.GetRoleFuncPurview(roleId)
	if getFuncRPIdsErr == gorm.ErrRecordNotFound {
		//beego.Error("获取角色的权限时出错:", getRPIdsErr)
		if roleFuncPurview.ID == 0 {
			rolePurviewIdStr = rolePurviewIdStr

		} else {
			rolePurviewIdStr = rolePurviewIdStr + "," + roleFuncPurview.PurviewIds
		}
	} else if getFuncRPIdsErr != nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return

	} else {
		if roleFuncPurview.ID == 0 {
			rolePurviewIdStr = rolePurviewIdStr
		} else {
			rolePurviewIdStr = rolePurviewIdStr + "," + roleFuncPurview.PurviewIds
		}
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"purviews":         purviews,
		"role":             role,
		"role_purview_ids": rolePurviewIdStr + "," + roleFuncPurview.PurviewIds,
	})
}

// /role/purview/edit [post]
// @param role_id:int
// @param purview_ids:string
func (this *RoleAPIController) EditPurview() {
	adminUserInfo := this.GetAdminUserInfo()
	roleId, _ := this.GetInt64("role_id")
	purviewIds := this.GetString("purview_ids")
	funcPurviewIds := this.GetString("func_purview_ids")

	if roleId <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	redis := service.RedisClient()
	defer redis.Close()

	users := service.GetAllUserRole(adminUserInfo.CurrentOrgId)
	for _, item := range users {
		key := "purviews_" + strconv.FormatInt(adminUserInfo.CurrentOrgId, 10) + strconv.FormatInt(item.AdminUserId, 10)
		redis.Set(key, "", time.Second)
	}

	err := service.SaveRolePurviewIds(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, roleId, purviewIds)
	err = service.SaveFuncRolePurviewIds(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, roleId, funcPurviewIds)

	if err != nil {
		//beego.Error("设置角色的权限时出错:", err)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)
	} else {
		this.ServeSuccessJSON(nil)
	}
}

// func (this *RoleAPIController) doesUserHaveAccess(userID int64) bool {
// 	adminUser, getAdminUserErr := service.GetAdminUserByUserID(userID)
// 	if getAdminUserErr != nil {
// 		beego.Error("获取用户信息失败:%v", getAdminUserErr)
// 		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
// 		return false
// 	} else if adminUser == nil {
// 		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdminUserNotExist)
// 		return false
// 	} else if adminUser.Status == 2 {
// 		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUserWasForbidden)
// 		return false
// 	} else if adminUser.IsSuperAdmin == false {
// 		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
// 		return false
// 	}
// 	return true
// }

// func (this *RoleAPIController) isAppRoleExist(orgID int64, appID int64, userID int64) bool {
// 	appRole, getAppRoleErr := service.GetAppRole(orgID, appID, userID)
// 	if getAppRoleErr != nil {
// 		beego.Error("检查用户和机构应用对应关系时失败:%v", getAppRoleErr)
// 		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
// 		return false
// 	} else if appRole == nil {
// 		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
// 		return false
// 	}
// 	return true
// }

// /api/adminmain [get]
func (this *RoleAPIController) AdminMainView() {
	adminUserInfo := this.GetAdminUserInfo()
	var isSubSuperAdmin bool = false
	adminUserRole, _ := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id)
	if len(adminUserRole.RoleIds) > 0 {
		role_ids := strings.Split(adminUserRole.RoleIds, ",")
		org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
		if adminUserInfo.AdminUser.Id != org.Creator {
			for _, item := range role_ids {
				id, _ := strconv.ParseInt(item, 10, 64)
				if id != 0 {
					role, _ := service.GetRoleByRoleID(id)
					if role != nil {
						if role.IsSystem == 1 && role.RoleName == "子管理员" {
							isSubSuperAdmin = true
						}
					}
				}
			}
		}
	}
	org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)

	viewModels, _, getAdminsErr := service.GetAdminUsersAndLoginInfo(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, 1, 100)
	if getAdminsErr != nil {
		//beego.Error("获取管理员列表失败:", getAdminsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"admins":          viewModels,
		"org":             org,
		"isSubSuperAdmin": isSubSuperAdmin,
	})
}

// /api/admins [get]
// @param page?:int
func (this *RoleAPIController) Admins() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	page, _ := this.GetInt("page")
	viewModels, total, getAdminsErr := service.GetAdminUsersAndLoginInfo(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, page, 100)
	if getAdminsErr != nil {
		//beego.Error("获取管理员列表失败:", getAdminsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	} else {
		this.ServeSuccessJSON(map[string]interface{}{
			"admins":      viewModels,
			"total_count": total,
		})
	}
}

// /api/admin/addinit [get]
func (this *RoleAPIController) AddAdminInitData() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	var isSubSuperAdmin bool = false
	adminUserRole, _ := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id)

	if len(adminUserRole.RoleIds) > 0 {
		//app_role, _ := service.GetAppRoleById(adminUserInfo.)
		role_ids := strings.Split(adminUserRole.RoleIds, ",")

		org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)

		if adminUserInfo.AdminUser.Id != org.Creator {
			for _, item := range role_ids {
				id, _ := strconv.ParseInt(item, 10, 64)
				if id != 0 {
					role, _ := service.GetRoleByRoleID(id)
					if role != nil {
						if role.IsSystem == 1 && role.RoleName == "子管理员" {
							isSubSuperAdmin = true
						}
					}
				}
			}
		}
	}
	org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)

	roles, getRoleErr := service.GetAllValidRoles(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId)
	if getRoleErr != nil {
		//beego.Error("获取所有角色失败:", getRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	redisClient := service.RedisClient()
	defer redisClient.Close()
	qntoken, _ := redisClient.Get("qn_token").Result()

	this.ServeSuccessJSON(map[string]interface{}{
		"roles":           roles,
		"qntoken":         qntoken,
		"isSubSuperAdmin": isSubSuperAdmin,
		"org":             org,
	})
}

// /api/admin/add [post]
// @param mobile:string
// @param name:string
// @param type:int 管理员类型：2.医生 3.护士 4.运营
// @param title:int 用户职称（1.医士；2.医师；3.住院医师；4.主治医师；5.副主任医师；6.主任医师；7.护士；8.护师；9.主管护师；10.副主任护师；11.主任护师；12.运营专员；13.运营主管）
// @param role:int
// @param intro?:string
func (this *RoleAPIController) AddAdmin() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	mobile := this.GetString("mobile")
	name := this.GetString("name")
	userType, _ := this.GetInt("type")
	userTitle, _ := this.GetInt("title")
	roleIds := this.GetString("role")
	user_title_name := this.GetString("user_title_name")
	department := this.GetString("department")
	department_id, _ := this.GetInt64("department_id")

	sex, _ := this.GetInt64("sex")

	age, _ := this.GetInt64("age")
	nation := this.GetString("nation")
	card_type, _ := this.GetInt64("card_type")
	id_card := this.GetString("id_card")
	education, _ := this.GetInt64("education")
	study_major_name := this.GetString("study_major_name")
	work_major_name := this.GetString("work_major_name")
	role_type, _ := this.GetInt64("role_type")
	medical_code := this.GetString("medical_code")
	doctor_code := this.GetString("doctor_code")
	licensing, _ := this.GetInt64("licensing")
	job_number := this.GetString("job_number")

	prescription_qualification_identification, _ := this.GetInt64("prescription_qualification_identification")
	identification_outpatients, _ := this.GetInt64("identification_outpatients")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	start_time := this.GetString("start_time")

	theStartTime, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)

	medical_range_code, _ := this.GetInt64("medical_range_code")
	medical_level, _ := this.GetInt64("medical_level")
	medical_type_job, _ := this.GetInt64("medical_type_job")
	pharmacist_registration_number := this.GetString("pharmacist_registration_number")
	doctor_range_code, _ := this.GetInt64("doctor_range_code")
	doctor_level, _ := this.GetInt64("doctor_level")
	doctor_type_job, _ := this.GetInt64("doctor_type_job")
	doctor_number := this.GetString("doctor_number")
	outpatient_illnessCategory := this.GetString("outpatient_illnessCategory")
	is_active, _ := this.GetInt64("is_active")
	active_status, _ := this.GetInt64("active_status")
	fmt.Println("active_status", active_status)
	if len(mobile) == 0 || len(name) == 0 || (userType != 2 && userType != 3 && userType != 4) || len(roleIds) <= 0 {

		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	// 判断是否已存在该手机号
	if adminUser, err := service.GetValidAdminUserByMobileReturnErr(mobile); err != nil {
		//beego.Error("查询用户是否已被添加为管理员时失败:", err)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else {
		if adminUser == nil { //新增账号和用户
			_, password, createErr := service.CreateGeneralAdminUserOne(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, mobile, name, user_title_name, roleIds, userType, userTitle, department_id, department, sex, age, nation, card_type, id_card, education, study_major_name, work_major_name, role_type, medical_code, doctor_code, licensing, job_number, prescription_qualification_identification, identification_outpatients, theStartTime.Unix(), medical_range_code, medical_level, medical_type_job, pharmacist_registration_number, doctor_range_code, doctor_level, doctor_type_job, doctor_number, outpatient_illnessCategory, is_active, active_status)
			if createErr != nil {
				//beego.Error("创建管理员失败:", createErr)
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBCreate)
				return

			} else {
				sendSMSErr := service.SMSSendInviteMobileToJoinOrgAdmin(name, mobile, password)
				if sendSMSErr != nil {
				}

				this.ServeSuccessJSON(nil)
				return
			}
		} else {

			total, _ := service.FindAdminUserByID(adminUser.Id, adminUserInfo.CurrentOrgId)
			if total <= 0 {
				//新增用户
				app_role := &models.App_Role{
					AdminUserId:                             adminUser.Id,
					OrgId:                                   adminUserInfo.CurrentOrgId,
					AppId:                                   adminUserInfo.CurrentAppId,
					Avatar:                                  "",
					UserName:                                name,
					UserTitleName:                           user_title_name,
					Status:                                  1,
					UserType:                                int8(userType),
					UserTitle:                               int8(userTitle),
					CreateTime:                              time.Now().Unix(),
					ModifyTime:                              time.Now().Unix(),
					RoleIds:                                 roleIds,
					Department:                              department,
					DepartmentId:                            department_id,
					Sex:                                     sex,
					Age:                                     age,
					Nation:                                  nation,
					CardType:                                card_type,
					IdCard:                                  id_card,
					Education:                               education,
					StudyMajorName:                          study_major_name,
					WorkMajorName:                           work_major_name,
					RoleType:                                role_type,
					MedicalCode:                             medical_code,
					DoctorCode:                              doctor_code,
					Licensing:                               licensing,
					JobNumber:                               job_number,
					PrescriptionQualificationIdentification: prescription_qualification_identification,
					IdentificationOutpatients:               identification_outpatients,
					StartTime:                               theStartTime.Unix(),
					MedicalRangeCode:                        medical_range_code,
					MedicalLevel:                            medical_level,
					MedicalTypeJob:                          medical_type_job,
					PharmacistRegistrationNumber:            pharmacist_registration_number,
					DoctorRangeCode:                         doctor_range_code,
					DoctorLevel:                             doctor_level,
					DoctorTypeJob:                           doctor_type_job,
					DoctorNumber:                            doctor_number,
					OutpatientIllnesscategory:               outpatient_illnessCategory,
					IsActive:                                is_active,
					ActiveStatus:                            active_status,
				}
				err := service.CreateUserRole(app_role)
				if err != nil {
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBCreate)
					return
				}
				this.ServeSuccessJSON(nil)
			} else {
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRepeatCreateStaffException)
				return
			}

			return
		}
	}

}

// /api/admin/editinit [get]
// @param uid:int
func (this *RoleAPIController) EditAdminInitData() {
	adminUserInfo := this.GetAdminUserInfo()

	admin_user_id, _ := this.GetInt64("uid")
	if admin_user_id <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	appRole, getAppRoleErr := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, admin_user_id)
	if getAppRoleErr != nil {
		//beego.Error("查询管理员信息时失败:", getAppRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	if appRole == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdminUserNotExist)
		return
	}

	roles, getRoleErr := service.GetAllValidRoles(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId)
	if getRoleErr != nil {
		//beego.Error("获取所有角色失败:", getRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	var isSubSuperAdmin bool = false
	adminUserRole, _ := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id)
	if len(adminUserRole.RoleIds) > 0 {
		role_ids := strings.Split(adminUserRole.RoleIds, ",")
		org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
		if adminUserInfo.AdminUser.Id != org.Creator {
			for _, item := range role_ids {
				id, _ := strconv.ParseInt(item, 10, 64)
				if id != 0 {
					role, _ := service.GetRoleByRoleID(id)
					if role.IsSystem == 1 && role.RoleName == "子管理员" {
						isSubSuperAdmin = true
					}
				}
			}
		}
	}
	org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)

	redisClient := service.RedisClient()
	defer redisClient.Close()
	qntoken, _ := redisClient.Get("qn_token").Result()

	this.ServeSuccessJSON(map[string]interface{}{
		"admin":           appRole,
		"roles":           roles,
		"qntoken":         qntoken,
		"isSubSuperAdmin": isSubSuperAdmin,
		"org":             org,
	})
}

// /api/admin/edit [post]
// @param uid:int
// @param name:string
// @param type:int
// @param title:int
// @param role:int
// @param intro?:string
func (this *RoleAPIController) EditAdmin() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	adminUserId, _ := this.GetInt64("uid")
	name := this.GetString("name")
	userType, _ := this.GetInt("type")
	userTitle, _ := this.GetInt("title")
	roleIds := this.GetString("role")
	intro := this.GetString("intro")
	user_title_name := this.GetString("user_title_name")
	department := this.GetString("department")
	department_id, _ := this.GetInt64("department_id")
	sort, _ := this.GetInt64("sort")
	sex, _ := this.GetInt64("sex")
	age, _ := this.GetInt64("age")
	nation := this.GetString("nation")
	card_type, _ := this.GetInt64("card_type")
	id_card := this.GetString("id_card")
	education, _ := this.GetInt64("education")
	study_major_name := this.GetString("study_major_name")
	work_major_name := this.GetString("work_major_name")
	role_type, _ := this.GetInt64("role_type")
	medical_code := this.GetString("medical_code")
	doctor_code := this.GetString("doctor_code")
	licensing, _ := this.GetInt64("licensing")
	job_number := this.GetString("job_number")

	prescription_qualification_identification, _ := this.GetInt64("prescription_qualification_identification")
	identification_outpatients, _ := this.GetInt64("identification_outpatients")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	start_time := this.GetString("start_time")
	fmt.Println("start_time22222222222", start_time)
	theStartTime, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)

	medical_range_code, _ := this.GetInt64("medical_range_code")
	medical_level, _ := this.GetInt64("medical_level")
	medical_type_job, _ := this.GetInt64("medical_type_job")
	pharmacist_registration_number := this.GetString("pharmacist_registration_number")
	doctor_range_code, _ := this.GetInt64("doctor_range_code")
	doctor_level, _ := this.GetInt64("doctor_level")
	doctor_type_job, _ := this.GetInt64("doctor_type_job")
	doctor_number := this.GetString("doctor_number")
	outpatient_illnessCategory := this.GetString("outpatient_illnessCategory")
	is_active, _ := this.GetInt64("is_active")
	active_status, _ := this.GetInt64("active_status")

	_, titleExist := models.UserTitle[userTitle]
	fmt.Println(titleExist)
	if adminUserId <= 0 || len(name) == 0 || (userType != 2 && userType != 3 && userType != 4) || !titleExist || len(roleIds) <= 0 {
		fmt.Println("进来了吗")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	appRole, getAppRoleErr := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserId)
	if getAppRoleErr != nil {
		//beego.Error("查询管理员信息时失败:", getAppRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	if appRole == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdminUserNotExist)
		return
	}
	appRole.Department = department
	appRole.DepartmentId = department_id
	appRole.UserName = name
	appRole.UserType = int8(userType)
	appRole.UserTitle = int8(userTitle)
	appRole.RoleIds = roleIds
	appRole.Intro = intro
	appRole.UserTitleName = user_title_name
	appRole.ModifyTime = time.Now().Unix()
	appRole.Sort = sort
	appRole.Age = age
	appRole.Nation = nation
	appRole.CardType = card_type
	appRole.IdCard = id_card
	appRole.Education = education
	appRole.StudyMajorName = study_major_name
	appRole.WorkMajorName = work_major_name
	appRole.RoleType = role_type
	appRole.MedicalCode = medical_code
	appRole.DoctorCode = doctor_code
	appRole.Licensing = licensing
	appRole.JobNumber = job_number
	appRole.PrescriptionQualificationIdentification = prescription_qualification_identification
	appRole.IdentificationOutpatients = identification_outpatients
	appRole.StartTime = theStartTime.Unix()
	appRole.MedicalCode = medical_code
	appRole.MedicalRangeCode = medical_range_code
	appRole.MedicalLevel = medical_level
	appRole.MedicalTypeJob = medical_type_job
	appRole.PharmacistRegistrationNumber = pharmacist_registration_number
	appRole.DoctorRangeCode = doctor_range_code
	appRole.DoctorLevel = doctor_level
	appRole.DoctorTypeJob = doctor_type_job
	appRole.DoctorNumber = doctor_number
	appRole.OutpatientIllnesscategory = outpatient_illnessCategory
	appRole.IsActive = is_active
	appRole.ActiveStatus = active_status
	appRole.Sex = sex
	saveErr := service.SaveAppRole(appRole)
	if saveErr != nil {
		//beego.Error("修改App_Role失败:", saveErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)

	} else {
		this.ServeSuccessJSON(map[string]interface{}{
			"approle": appRole,
		})
		this.ServeSuccessJSON(nil)
	}
}

// /api/admin/setstatus [post]
// @param uid:int
// @param enable:bool
func (this *RoleAPIController) AdminSetStatus() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	userID, _ := this.GetInt64("uid")
	if userID <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	appRole, getAppRoleErr := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, userID)
	if getAppRoleErr != nil {
		//beego.Error("查询管理员信息失败:", getAppRoleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if appRole == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdminUserNotExist)
		return
	}

	enable, _ := this.GetBool("enable")

	if enable {
		appRole.Status = 1
	} else {
		appRole.Status = 0
	}
	appRole.ModifyTime = time.Now().Unix()
	saveErr := service.SaveAppRole(appRole)
	if saveErr != nil {
		//beego.Error("保存AppRole失败:", saveErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)

	} else {
		this.ServeSuccessJSON(nil)
	}
}

// /api/admin/specialpermission/initdata [get]
func (this *RoleAPIController) SpecialPermissionInitData() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	adminUsers, getAdminUsersErr := service.GetAllGeneralAdminUsers(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId)
	if getAdminUsersErr != nil {
		this.ErrorLog("获取所有普通用户失败:%v", getAdminUsersErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	headNurses, getAllHeadNursesErr := service.GetAllValidAdminUsersWithSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, models.SpecialPermissionTypeHeadNurse)
	if getAllHeadNursesErr != nil {
		this.ErrorLog("获取所有拥有护士长特殊权限的用户失败:%v", getAllHeadNursesErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"users":       adminUsers,
		"head_nurses": headNurses,
	})
}

// /api/admin/specialpermission/dialysisrecord/submit [post]
// @param ids:string ("1,2,5")
func (this *RoleAPIController) SubmitDialysisRecordPermission() {
	adminUserInfo := this.GetAdminUserInfo()
	//if adminUserInfo.AdminUser.IsSuperAdmin == false {
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePermissionDenied)
	//	return
	//}

	idsString := this.GetString("ids")
	if len(idsString) == 0 {
		// 取消所有用户的护士长权限
		cancelErr := service.CancelAllSpecialPermissionAdminUsers(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, models.SpecialPermissionTypeHeadNurse)
		if cancelErr != nil {
			this.ErrorLog("取消所有用户的护士长权限失败:%v", cancelErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		} else {
			this.ServeSuccessJSON(nil)
			return
		}

	} else {
		ids := make([]int64, 0)
		idStrs := strings.Split(idsString, ",")
		for _, idStr := range idStrs {
			id, parseErr := strconv.Atoi(idStr)
			if parseErr != nil {
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
				return
			}
			ids = append(ids, int64(id))
		}

		headNurses, getAllHeadNursesErr := service.GetAllSpecialPermissionAdminUsersWithoutStatus(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, models.SpecialPermissionTypeHeadNurse)
		if getAllHeadNursesErr != nil {
			this.ErrorLog("获取所有拥有或曾拥有护士长特殊权限的用户失败:%v", getAllHeadNursesErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		cancelList := make([]*models.AdminUserSpecialPermission, 0)
		addList := make([]*models.AdminUserSpecialPermission, 0)
		for _, id := range ids {
			exit := false
			for _, headNurse := range headNurses {
				if headNurse.AdminUserID == id {
					exit = true
					if headNurse.Status != 1 {
						headNurse.Status = 1
						headNurse.ModifyTime = time.Now().Unix()
						addList = append(addList, headNurse)
					}
					break
				}
			}
			if exit == false {
				newHeadNurse := &models.AdminUserSpecialPermission{
					OrgID:       adminUserInfo.CurrentOrgId,
					AppID:       adminUserInfo.CurrentAppId,
					AdminUserID: id,
					Permission:  int64(models.SpecialPermissionTypeHeadNurse),
					Status:      1,
					CreateTime:  time.Now().Unix(),
					ModifyTime:  time.Now().Unix(),
				}
				addList = append(addList, newHeadNurse)
			}
		}

		for _, headNurse := range headNurses {
			cancel := true
			for _, willAdd := range addList {
				if willAdd.AdminUserID == headNurse.AdminUserID {
					cancel = false
					break
				}
			}
			if cancel {
				headNurse.Status = 0
				headNurse.ModifyTime = time.Now().Unix()
				cancelList = append(cancelList, headNurse)
			}
		}

		addErr := service.BatchSaveSpecialPermissionAdminUsers(addList)
		if addErr != nil {
			this.ErrorLog("授权失败：%v", addErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		cancelErr := service.BatchSaveSpecialPermissionAdminUsers(cancelList)
		if cancelErr != nil {
			this.ErrorLog("取消授权失败：%v", cancelErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		this.ServeSuccessJSON(nil)
	}

}

func (this *RoleAPIController) GetAllOrgRole() {
	adminUserInfo := this.GetAdminUserInfo()

	var isSubSuperAdmin bool = false
	adminUserRole, _ := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id)

	if len(adminUserRole.RoleIds) > 0 {
		//app_role, _ := service.GetAppRoleById(adminUserInfo.)
		role_ids := strings.Split(adminUserRole.RoleIds, ",")
		org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
		if adminUserInfo.AdminUser.Id != org.Creator {
			for _, item := range role_ids {
				id, _ := strconv.ParseInt(item, 10, 64)
				if id != 0 {
					role, _ := service.GetRoleByRoleID(id)
					if role != nil {
						if role.IsSystem == 1 && role.RoleName == "子管理员" {
							isSubSuperAdmin = true
						}
					}
				}
			}
		}
	}
	org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)

	roles, err := service.GetAllOrgValidRoles(adminUserInfo.CurrentOrgId, isSubSuperAdmin)
	if err != nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else {
		this.ServeSuccessJSON(map[string]interface{}{
			"roles":           roles,
			"isSubSuperAdmin": isSubSuperAdmin,
			"org":             org,
		})
	}

}

func (this *RoleAPIController) GetAllOrgUser() {
	adminUserInfo := this.GetAdminUserInfo()
	org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
	var isSubSuperAdmin bool = false
	adminUserRole, _ := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id)
	if len(adminUserRole.RoleIds) > 0 {
		//app_role, _ := service.GetAppRoleById(adminUserInfo.)
		role_ids := strings.Split(adminUserRole.RoleIds, ",")
		org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
		if adminUserInfo.AdminUser.Id != org.Creator {
			for _, item := range role_ids {
				id, _ := strconv.ParseInt(item, 10, 64)
				if id != 0 {
					role, _ := service.GetRoleByRoleID(id)
					if role != nil {
						if role.IsSystem == 1 && role.RoleName == "子管理员" {
							isSubSuperAdmin = true
						}
					}
				}
			}
		}
	}
	viewModels, _, _ := service.GetAllAdminUsersAndRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, 1, 100)
	this.ServeSuccessJSON(map[string]interface{}{
		"admins":          viewModels,
		"org":             org,
		"isSubSuperAdmin": isSubSuperAdmin,
	})
}

func (this *RoleAPIController) AddRoleStaff() {
	//adminUserInfo := this.GetMobileAdminUserInfo()
	role_id, _ := this.GetInt64("id", 0)
	staff_ids := this.GetString("ids")
	ids := strings.Split(staff_ids, ",")
	for _, item := range ids {
		id, _ := strconv.ParseInt(item, 10, 64)
		role, _ := service.FindAdminUserID(id)
		role.RoleIds = role.RoleIds + "," + strconv.FormatInt(role_id, 10)
		service.SaveAdminUser(&role)
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"msg": "添加成功",
	})

}

func (this *RoleAPIController) GetRoleStaff() {
	adminUserInfo := this.GetAdminUserInfo()

	var isSubSuperAdmin bool = false
	adminUserRole, _ := service.GetAppRole(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id)
	if len(adminUserRole.RoleIds) > 0 {
		role_ids := strings.Split(adminUserRole.RoleIds, ",")
		org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
		if adminUserInfo.AdminUser.Id != org.Creator {
			for _, item := range role_ids {
				id, _ := strconv.ParseInt(item, 10, 64)
				if id != 0 {
					role, _ := service.GetRoleByRoleID(id)
					if role.IsSystem == 1 && role.RoleName == "子管理员" {
						isSubSuperAdmin = true
					}
				}
			}
		}
	}
	org, _ := service.GetOrgById(adminUserInfo.CurrentOrgId)
	viewModels, _, getAdminsErr := service.GetAdminUsersAndLoginInfo(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, 1, 100)
	if getAdminsErr != nil {
		//beego.Error("获取管理员列表失败:", getAdminsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"admins":          viewModels,
		"org":             org,
		"isSubSuperAdmin": isSubSuperAdmin,
	})

}

func (this *RoleAPIController) GetRoleInfo() {
	roleId, _ := this.GetInt64("role_id")
	if roleId <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	role, _ := service.GetRoleByRoleID(roleId)
	this.ServeSuccessJSON(map[string]interface{}{
		"role": role,
	})

}
