Browse Source

fix: 完善研究员考核接口

hsun 3 days ago
parent
commit
d0b7c81290

+ 2 - 2
controllers/assessment/assessment_form.go

@@ -175,9 +175,9 @@ func (this *AssessmentFormController) WeekBase() {
 	varietyMappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
 	{
 		mappingOb := new(models.AssessmentResearcherVarietyMapping)
-		cond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().AdminId)
+		cond := fmt.Sprintf(` AND %s = ?`, mappingOb.Cols().AssessmentResearcherId)
 		pars := make([]interface{}, 0)
-		pars = append(pars, sysUser.AdminId)
+		pars = append(pars, researcher.AssessmentResearcherId)
 		mappings, e := mappingOb.GetItemsByCondition(cond, pars, []string{}, "")
 		if e != nil {
 			br.Msg = "获取失败"

+ 113 - 51
controllers/assessment/assessment_researcher.go

@@ -50,9 +50,11 @@ func (this *AssessmentResearcherController) Add() {
 		br.Msg = "请选择研究员"
 		return
 	}
-
-	// 检验是否已添加过
+	disabledResearcher := new(models.AssessmentResearcher)
 	researcherOb := new(models.AssessmentResearcher)
+	mappingOb := new(models.AssessmentResearcherAdminMapping)
+
+	// 去重校验:系统用户ID
 	{
 		cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().AdminId)
 		pars := make([]interface{}, 0)
@@ -63,9 +65,13 @@ func (this *AssessmentResearcherController) Add() {
 			br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
 			return
 		}
+		// PS.由于删除研究员需要保留历史填报数据,如果研究员被删除(即禁用)那么重新启用即可
 		if exists != nil && exists.AssessmentResearcherId > 0 {
-			br.Msg = "该研究员已添加,请勿重复添加"
-			return
+			if exists.Enabled == models.AssessmentResearcherEnabled {
+				br.Msg = "该研究员已添加,请勿重复添加"
+				return
+			}
+			disabledResearcher = exists
 		}
 	}
 
@@ -83,16 +89,41 @@ func (this *AssessmentResearcherController) Add() {
 		br.Msg = "该用户被禁用,请重新选择"
 		return
 	}
-	newResearcher := new(models.AssessmentResearcher)
-	newResearcher.AdminId = req.AdminId
-	newResearcher.RealName = sysAdmin.RealName
-	newResearcher.Enabled = sysAdmin.Enabled
-	newResearcher.CreateTime = time.Now().Local()
-	newResearcher.ModifyTime = time.Now().Local()
-	if e = newResearcher.Create(); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("新增研究员失败, %v", e)
-		return
+
+	var researcherId int
+	if disabledResearcher != nil && disabledResearcher.AssessmentResearcherId > 0 {
+		disabledResearcher.RealName = sysAdmin.RealName
+		disabledResearcher.Enabled = models.AssessmentResearcherEnabled
+		disabledResearcher.ModifyTime = time.Now().Local()
+		updateCols := []string{researcherOb.Cols().RealName, researcherOb.Cols().Enabled, researcherOb.Cols().ModifyTime}
+		if e := disabledResearcher.Update(updateCols); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("重新启用研究员失败, %v", e)
+			return
+		}
+		researcherId = disabledResearcher.AssessmentResearcherId
+
+		// 清除原有关联
+		cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().AssessmentResearcherId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, researcherId)
+		if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("清空权限失败, %v", e)
+			return
+		}
+	} else {
+		newResearcher := new(models.AssessmentResearcher)
+		newResearcher.AdminId = req.AdminId
+		newResearcher.RealName = sysAdmin.RealName
+		newResearcher.Enabled = models.AssessmentResearcherEnabled
+		newResearcher.CreateTime = time.Now().Local()
+		newResearcher.ModifyTime = time.Now().Local()
+		if e = newResearcher.Create(); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("新增研究员失败, %v", e)
+			return
+		}
 	}
 
 	// 查看/统计权限
@@ -100,7 +131,7 @@ func (this *AssessmentResearcherController) Add() {
 	if len(req.ViewAdminIds) > 0 {
 		for _, v := range req.ViewAdminIds {
 			m := new(models.AssessmentResearcherAdminMapping)
-			m.AssessmentResearcherId = newResearcher.AssessmentResearcherId
+			m.AssessmentResearcherId = researcherId
 			m.AdminId = req.AdminId
 			m.AuthAdminId = v
 			m.AuthType = models.AssessmentResearcherAdminAuthTypeView
@@ -110,7 +141,7 @@ func (this *AssessmentResearcherController) Add() {
 	if len(req.AssessmentAdminIds) > 0 {
 		for _, v := range req.AssessmentAdminIds {
 			m := new(models.AssessmentResearcherAdminMapping)
-			m.AssessmentResearcherId = newResearcher.AssessmentResearcherId
+			m.AssessmentResearcherId = researcherId
 			m.AdminId = req.AdminId
 			m.AuthAdminId = v
 			m.AuthType = models.AssessmentResearcherAdminAuthTypeStatistics
@@ -118,7 +149,6 @@ func (this *AssessmentResearcherController) Add() {
 		}
 	}
 	if len(mappings) > 0 {
-		mappingOb := new(models.AssessmentResearcherAdminMapping)
 		if e = mappingOb.CreateMulti(mappings); e != nil {
 			br.Msg = "操作失败"
 			br.ErrMsg = fmt.Sprintf("批量新增权限失败, %v", e)
@@ -176,6 +206,10 @@ func (this *AssessmentResearcherController) Edit() {
 		br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
 		return
 	}
+	if researcher.Enabled == models.AssessmentResearcherDisabled {
+		br.Msg = "研究员不存在,请刷新页面"
+		return
+	}
 
 	// 查看/统计权限
 	mappings := make([]*models.AssessmentResearcherAdminMapping, 0)
@@ -202,9 +236,9 @@ func (this *AssessmentResearcherController) Edit() {
 	// 清空关联后新增
 	mappingOb := new(models.AssessmentResearcherAdminMapping)
 	{
-		cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().AdminId)
+		cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().AssessmentResearcherId)
 		pars := make([]interface{}, 0)
-		pars = append(pars, researcher.AdminId)
+		pars = append(pars, researcher.AssessmentResearcherId)
 		if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
 			br.Msg = "操作失败"
 			br.ErrMsg = fmt.Sprintf("清空权限失败, %v", e)
@@ -271,36 +305,47 @@ func (this *AssessmentResearcherController) Remove() {
 		br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
 		return
 	}
-	if e = researcher.Remove(); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("删除研究员失败, %v", e)
+	if researcher.Enabled == models.AssessmentResearcherDisabled {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
 		return
 	}
 
-	// 清空关联
-	adminMappingOb := new(models.AssessmentResearcherAdminMapping)
-	{
-		cond := fmt.Sprintf(`%s = ?`, adminMappingOb.Cols().AdminId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, researcher.AdminId)
-		if e = adminMappingOb.RemoveByCondition(cond, pars); e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = fmt.Sprintf("清空权限失败, %v", e)
-			return
-		}
-	}
-	varietyMappingOb := new(models.AssessmentResearcherVarietyMapping)
-	{
-		cond := fmt.Sprintf(`%s = ?`, varietyMappingOb.Cols().AdminId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, researcher.AdminId)
-		if e = varietyMappingOb.RemoveByCondition(cond, pars); e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = fmt.Sprintf("清空品种关联失败, %v", e)
-			return
-		}
+	// 由于要保留历史填报数据,这里实际为禁用操作
+	updateCols := []string{researcherOb.Cols().Enabled, researcherOb.Cols().ModifyTime}
+	researcher.Enabled = models.AssessmentResearcherDisabled
+	researcher.ModifyTime = time.Now()
+	if e = researcher.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("禁用研究员失败, %v", e)
+		return
 	}
 
+	// 关联也不需要清理
+	//adminMappingOb := new(models.AssessmentResearcherAdminMapping)
+	//{
+	//	cond := fmt.Sprintf(`%s = ?`, adminMappingOb.Cols().AdminId)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, researcher.AdminId)
+	//	if e = adminMappingOb.RemoveByCondition(cond, pars); e != nil {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("清空权限失败, %v", e)
+	//		return
+	//	}
+	//}
+	//varietyMappingOb := new(models.AssessmentResearcherVarietyMapping)
+	//{
+	//	cond := fmt.Sprintf(`%s = ?`, varietyMappingOb.Cols().AdminId)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, researcher.AdminId)
+	//	if e = varietyMappingOb.RemoveByCondition(cond, pars); e != nil {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("清空品种关联失败, %v", e)
+	//		return
+	//	}
+	//}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -346,6 +391,10 @@ func (this *AssessmentResearcherController) Detail() {
 		br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
 		return
 	}
+	if researcher.Enabled == models.AssessmentResearcherDisabled {
+		br.Msg = "研究员不存在,请刷新页面"
+		return
+	}
 	resp := researcher.Format2Detail()
 
 	// 获取系统用户
@@ -381,6 +430,10 @@ func (this *AssessmentResearcherController) Detail() {
 		if ad == nil {
 			continue
 		}
+		// 详情这里只显示启用的系统用户
+		if ad.Enabled != 1 {
+			continue
+		}
 		ar := models.AssessmentResearcherDetail{
 			AdminId:  m.AuthAdminId,
 			RealName: ad.RealName,
@@ -443,9 +496,8 @@ func (this *AssessmentResearcherController) PageList() {
 
 	// 筛选条件
 	researcherOb := new(models.AssessmentResearcher)
-	cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().Enabled)
+	cond := ``
 	pars := make([]interface{}, 0)
-	pars = append(pars, models.AssessmentResearcherEnabled)
 	{
 		// 研究员姓名
 		if params.RealName != "" {
@@ -517,6 +569,12 @@ func (this *AssessmentResearcherController) PageList() {
 			cond += fmt.Sprintf(` AND %s IN (?)`, researcherOb.Cols().PrimaryId)
 			pars = append(pars, researcherIds)
 		}
+
+		// 仅显示启用的
+		if params.OnlyEnabled {
+			cond += fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().Enabled)
+			pars = append(pars, models.AssessmentResearcherEnabled)
+		}
 	}
 
 	// 分页列表
@@ -532,11 +590,11 @@ func (this *AssessmentResearcherController) PageList() {
 		br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
 		return
 	}
-	var adminIds []int
+	var researcherIds []int
 	for _, v := range researchers {
-		adminIds = append(adminIds, v.AdminId)
+		researcherIds = append(researcherIds, v.AssessmentResearcherId)
 	}
-	if total == 0 || len(adminIds) == 0 {
+	if total == 0 || len(researcherIds) == 0 {
 		resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
 		br.Data = resp
 		br.Ret = 200
@@ -563,9 +621,9 @@ func (this *AssessmentResearcherController) PageList() {
 	viewAdminMappings, assessmentAdminMappings := make(map[int][]models.AssessmentResearcherDetail), make(map[int][]models.AssessmentResearcherDetail)
 	{
 		mappingOb := new(models.AssessmentResearcherAdminMapping)
-		condMapping := fmt.Sprintf(` AND %s IN (?)`, mappingOb.Cols().AdminId)
+		condMapping := fmt.Sprintf(` AND %s IN (?)`, mappingOb.Cols().AssessmentResearcherId)
 		parsMapping := make([]interface{}, 0)
-		parsMapping = append(parsMapping, adminIds)
+		parsMapping = append(parsMapping, researcherIds)
 		list, e := mappingOb.GetItemsByCondition(condMapping, parsMapping, []string{}, "")
 		if e != nil {
 			br.Msg = "获取失败"
@@ -577,6 +635,10 @@ func (this *AssessmentResearcherController) PageList() {
 			if ad == nil {
 				continue
 			}
+			// 详情这里只显示启用的系统用户
+			if ad.Enabled != 1 {
+				continue
+			}
 			ar := models.AssessmentResearcherDetail{
 				AdminId:  v.AuthAdminId,
 				RealName: ad.RealName,

+ 119 - 63
controllers/assessment/assessment_variety.go

@@ -65,52 +65,79 @@ func (this *AssessmentVarietyController) Add() {
 		br.Msg = "请输入周度波动阈值"
 		return
 	}
-
-	// 检验重名
+	disabledVariety := new(models.AssessmentVariety)
 	varietyOb := new(models.AssessmentVariety)
+	mappingOb := new(models.AssessmentResearcherVarietyMapping)
+
+	// 去重校验:编码唯一
 	{
-		cond := fmt.Sprintf(` AND (%s = ? OR %s = ?)`, varietyOb.Cols().VarietyCode, varietyOb.Cols().VarietyName)
+		cond := fmt.Sprintf(` AND %s = ?`, varietyOb.Cols().VarietyCode)
 		pars := make([]interface{}, 0)
-		pars = append(pars, req.VarietyCode, req.VarietyName)
+		pars = append(pars, req.VarietyCode)
 		exists, e := varietyOb.GetItemByCondition(cond, pars, "")
 		if e != nil && !utils.IsErrNoRow(e) {
 			br.Msg = "操作失败"
-			br.ErrMsg = fmt.Sprintf("获取考核品种失败, %v", e)
+			br.ErrMsg = fmt.Sprintf("获取品种失败, %v", e)
 			return
 		}
+		// PS.由于删除品种需要保留历史填报数据,如果品种被删除(即禁用)那么重新启用即可
 		if exists != nil && exists.AssessmentVarietyId > 0 {
-			if exists.VarietyCode == req.VarietyCode {
+			if exists.Enabled == models.AssessmentVarietyEnabled {
 				br.Msg = "品种编码已存在,请勿重复添加"
 				return
 			}
-			if exists.VarietyName == req.VarietyName {
-				br.Msg = "品种名称已存在,请勿重复添加"
-				return
-			}
-			return
+			disabledVariety = exists
 		}
 	}
 
-	newVariety := new(models.AssessmentVariety)
-	newVariety.VarietyCode = req.VarietyCode
-	newVariety.VarietyName = req.VarietyName
-	newVariety.MonthlyFluctuate = req.MonthlyFluctuate
-	newVariety.WeeklyFluctuate = req.WeeklyFluctuate
-	newVariety.CreateTime = time.Now().Local()
-	newVariety.ModifyTime = time.Now().Local()
-	if e := newVariety.Create(); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("新增考核品种失败, %v", e)
-		return
+	var varietyId int
+	if disabledVariety != nil && disabledVariety.AssessmentVarietyId > 0 {
+		disabledVariety.VarietyName = req.VarietyName
+		disabledVariety.MonthlyFluctuate = req.MonthlyFluctuate
+		disabledVariety.WeeklyFluctuate = req.WeeklyFluctuate
+		disabledVariety.Enabled = models.AssessmentVarietyEnabled
+		disabledVariety.ModifyTime = time.Now().Local()
+		updateCols := []string{varietyOb.Cols().VarietyName, varietyOb.Cols().MonthlyFluctuate, varietyOb.Cols().WeeklyFluctuate, varietyOb.Cols().Enabled, varietyOb.Cols().ModifyTime}
+		if e := disabledVariety.Update(updateCols); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("重新启用品种失败, %v", e)
+			return
+		}
+		varietyId = disabledVariety.AssessmentVarietyId
+
+		// 清除原有关联
+		cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().VarietyId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, varietyId)
+		if e := mappingOb.RemoveByCondition(cond, pars); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("清空品种原关联失败, %v", e)
+			return
+		}
+	} else {
+		newVariety := new(models.AssessmentVariety)
+		newVariety.VarietyCode = req.VarietyCode
+		newVariety.VarietyName = req.VarietyName
+		newVariety.MonthlyFluctuate = req.MonthlyFluctuate
+		newVariety.WeeklyFluctuate = req.WeeklyFluctuate
+		newVariety.Enabled = models.AssessmentVarietyEnabled
+		newVariety.CreateTime = time.Now().Local()
+		newVariety.ModifyTime = time.Now().Local()
+		if e := newVariety.Create(); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("新增品种失败, %v", e)
+			return
+		}
+		varietyId = newVariety.AssessmentVarietyId
 	}
 
 	// 关联研究员
 	mappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
 	if len(req.AssessmentResearcherIds) > 0 {
 		researcherOb := new(models.AssessmentResearcher)
-		cond := fmt.Sprintf(` AND %s = ? AND %s IN (?)`, researcherOb.Cols().Enabled, researcherOb.Cols().PrimaryId)
+		cond := fmt.Sprintf(` AND %s IN (?)`, researcherOb.Cols().PrimaryId)
 		pars := make([]interface{}, 0)
-		pars = append(pars, models.AssessmentResearcherEnabled, req.AssessmentResearcherIds)
+		pars = append(pars, req.AssessmentResearcherIds)
 		researchers, e := researcherOb.GetItemsByCondition(cond, pars, []string{}, "")
 		if e != nil {
 			br.Msg = "获取失败"
@@ -119,14 +146,13 @@ func (this *AssessmentVarietyController) Add() {
 		}
 		for _, v := range researchers {
 			m := new(models.AssessmentResearcherVarietyMapping)
-			m.VarietyId = newVariety.AssessmentVarietyId
+			m.VarietyId = varietyId
 			m.AssessmentResearcherId = v.AssessmentResearcherId
 			m.AdminId = v.AdminId
 			mappings = append(mappings, m)
 		}
 	}
 	if len(mappings) > 0 {
-		mappingOb := new(models.AssessmentResearcherVarietyMapping)
 		if e := mappingOb.CreateMulti(mappings); e != nil {
 			br.Msg = "操作失败"
 			br.ErrMsg = fmt.Sprintf("批量新增研究员品种关联失败, %v", e)
@@ -192,6 +218,11 @@ func (this *AssessmentVarietyController) Edit() {
 		br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)
 		return
 	}
+	if variety.Enabled == models.AssessmentVarietyDisabled {
+		br.Msg = "品种不存在,请刷新页面"
+		return
+	}
+
 	variety.MonthlyFluctuate = req.MonthlyFluctuate
 	variety.WeeklyFluctuate = req.WeeklyFluctuate
 	variety.ModifyTime = time.Now().Local()
@@ -217,9 +248,9 @@ func (this *AssessmentVarietyController) Edit() {
 	mappings := make([]*models.AssessmentResearcherVarietyMapping, 0)
 	if len(req.AssessmentResearcherIds) > 0 {
 		researcherOb := new(models.AssessmentResearcher)
-		cond := fmt.Sprintf(` AND %s = ? AND %s IN (?)`, researcherOb.Cols().Enabled, researcherOb.Cols().PrimaryId)
+		cond := fmt.Sprintf(` AND %s IN (?)`, researcherOb.Cols().Enabled, researcherOb.Cols().PrimaryId)
 		pars := make([]interface{}, 0)
-		pars = append(pars, models.AssessmentResearcherEnabled, req.AssessmentResearcherIds)
+		pars = append(pars, req.AssessmentResearcherIds)
 		researchers, e := researcherOb.GetItemsByCondition(cond, pars, []string{}, "")
 		if e != nil {
 			br.Msg = "获取失败"
@@ -294,25 +325,36 @@ func (this *AssessmentVarietyController) Remove() {
 		br.ErrMsg = fmt.Sprintf("获取品种失败, %v", e)
 		return
 	}
-	if e = variety.Remove(); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = fmt.Sprintf("删除品种失败, %v", e)
+	if variety.Enabled == models.AssessmentVarietyDisabled {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
 		return
 	}
 
-	// 清空关联
-	mappingOb := new(models.AssessmentResearcherVarietyMapping)
-	{
-		cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().VarietyId)
-		pars := make([]interface{}, 0)
-		pars = append(pars, variety.AssessmentVarietyId)
-		if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = fmt.Sprintf("清空关联失败, %v", e)
-			return
-		}
+	// 由于要保留历史填报数据,这里实际为禁用操作
+	updateCols := []string{varietyOb.Cols().Enabled, varietyOb.Cols().ModifyTime}
+	variety.Enabled = models.AssessmentVarietyDisabled
+	variety.ModifyTime = time.Now()
+	if e = variety.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("禁用品种失败, %v", e)
+		return
 	}
 
+	// 关联也不需要清理
+	//mappingOb := new(models.AssessmentResearcherVarietyMapping)
+	//{
+	//	cond := fmt.Sprintf(`%s = ?`, mappingOb.Cols().VarietyId)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, variety.AssessmentVarietyId)
+	//	if e = mappingOb.RemoveByCondition(cond, pars); e != nil {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("清空关联失败, %v", e)
+	//		return
+	//	}
+	//}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -358,6 +400,10 @@ func (this *AssessmentVarietyController) Detail() {
 		br.ErrMsg = fmt.Sprintf("获取品种失败, %v", e)
 		return
 	}
+	if variety.Enabled == models.AssessmentVarietyDisabled {
+		br.Msg = "品种不存在,请刷新页面"
+		return
+	}
 	resp := variety.Format2Detail()
 
 	// 获取启用研究员
@@ -453,37 +499,47 @@ func (this *AssessmentVarietyController) PageList() {
 	}
 	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
 
-	// 列表
+	// 筛选项
 	varietyOb := new(models.AssessmentVariety)
-	cond := ``
-	pars := make([]interface{}, 0)
-	if params.AssessmentVarietyIds != "" {
-		var varietyIds []int
-		arr := strings.Split(params.AssessmentVarietyIds, ",")
-		for _, v := range arr {
-			i, _ := strconv.Atoi(v)
-			if i > 0 {
-				varietyIds = append(varietyIds, i)
+	condVariety := ``
+	parsVariety := make([]interface{}, 0)
+	{
+		if params.AssessmentVarietyIds != "" {
+			var varietyIds []int
+			arr := strings.Split(params.AssessmentVarietyIds, ",")
+			for _, v := range arr {
+				i, _ := strconv.Atoi(v)
+				if i > 0 {
+					varietyIds = append(varietyIds, i)
+				}
 			}
+			if len(varietyIds) == 0 {
+				resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
+				br.Data = resp
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				return
+			}
+			condVariety += fmt.Sprintf(" AND %s IN (?)", varietyOb.Cols().PrimaryId)
+			parsVariety = append(parsVariety, varietyIds)
 		}
-		if len(varietyIds) == 0 {
-			resp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
-			br.Data = resp
-			br.Ret = 200
-			br.Success = true
-			br.Msg = "获取成功"
-			return
+
+		// 仅显示启用的
+		if params.OnlyEnabled {
+			condVariety += fmt.Sprintf(` AND %s = ?`, varietyOb.Cols().Enabled)
+			parsVariety = append(parsVariety, models.AssessmentVarietyEnabled)
 		}
-		cond += fmt.Sprintf(" AND %s IN (?)", varietyOb.Cols().PrimaryId)
-		pars = append(pars, varietyIds)
 	}
-	total, e := varietyOb.GetCountByCondition(cond, pars)
+
+	// 列表
+	total, e := varietyOb.GetCountByCondition(condVariety, parsVariety)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = fmt.Sprintf("获取研究员列表总数失败, %v", e)
 		return
 	}
-	varieties, e := varietyOb.GetPageItemsByCondition(cond, pars, []string{}, "", startSize, params.PageSize)
+	varieties, e := varietyOb.GetPageItemsByCondition(condVariety, parsVariety, []string{}, "", startSize, params.PageSize)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = fmt.Sprintf("获取研究员失败, %v", e)

+ 17 - 0
controllers/sys_admin.go

@@ -654,6 +654,8 @@ func (this *SysAdminController) Edit() {
 		br.Msg = "账号名称已存在,请重新输入"
 		return
 	}
+	originName := item.RealName
+	originEnabled := item.Enabled
 
 	// 手机号和邮箱必填一个
 	req.Mobile = strings.TrimSpace(req.Mobile)
@@ -817,6 +819,11 @@ func (this *SysAdminController) Edit() {
 		}()
 	}
 
+	// 如果姓名或者状态被改变,那么同步更新考核研究员表
+	if originName != req.RealName || originEnabled != req.Enabled {
+		go services.SyncAssessmentResearcher(adminInfo.AdminId)
+	}
+
 	go eta_forum.AdminSave(adminInfo.AdminId)
 	br.Ret = 200
 	br.Success = true
@@ -900,6 +907,10 @@ func (this *SysAdminController) EditEnabled() {
 		br.ErrMsg = "操作失败,Err:" + err.Error()
 		return
 	}
+
+	// 同步更新考核研究员表
+	go services.SyncAssessmentResearcher(adminItem.AdminId)
+
 	go eta_forum.AdminSave(adminItem.AdminId)
 	br.Ret = 200
 	br.Success = true
@@ -970,6 +981,12 @@ func (this *SysAdminController) Delete() {
 			_, _ = etaTrialService.RemoveEtaTrialUser(r)
 		}()
 	}
+
+	// 同步更新考核研究员表
+	if adminInfo != nil && adminInfo.AdminId > 0 {
+		go services.SyncAssessmentResearcher(adminInfo.AdminId)
+	}
+
 	go eta_forum.AdminDelete(adminInfo.AdminName)
 	br.Ret = 200
 	br.Success = true

+ 6 - 0
models/assessment_form.go

@@ -355,3 +355,9 @@ type AssessmentFormResultStatisticItem struct {
 	TotalAccuracyA        float64 `description:"综合正确率1"`
 	TotalAccuracyB        float64 `description:"综合正确率2"`
 }
+
+func (m *AssessmentForm) UpdateResearcherName(researcherId int, researcherName string) (err error) {
+	sql := fmt.Sprintf(`UPDATE %s SET %s = ? WHERE %s = ?`, m.TableName(), m.Cols().ResearcherName, m.Cols().ResearcherId)
+	err = global.DEFAULT_DB.Exec(sql, researcherName, researcherId).Error
+	return
+}

+ 15 - 1
models/assessment_researcher.go

@@ -5,12 +5,14 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"gorm.io/gorm"
 	"strings"
 	"time"
 )
 
 const (
-	AssessmentResearcherEnabled = 1
+	AssessmentResearcherDisabled = 0
+	AssessmentResearcherEnabled  = 1
 )
 
 // AssessmentResearcher 考核研究员表
@@ -140,6 +142,17 @@ func (m *AssessmentResearcher) GetPageItemsByCondition(condition string, pars []
 	return
 }
 
+// AfterUpdate 同步更新其他表冗余
+func (m *AssessmentResearcher) AfterUpdate(tx *gorm.DB) (err error) {
+	if tx.Statement.Changed(m.Cols().RealName) {
+		fmt.Println(111)
+		formOb := new(AssessmentForm)
+		err = tx.Model(formOb).Where(fmt.Sprintf("%s = ?", formOb.Cols().ResearcherId), m.AssessmentResearcherId).Update(formOb.Cols().ResearcherName, m.RealName).Error
+		fmt.Println("AfterUpdate", err)
+	}
+	return
+}
+
 // AssessmentResearcherAddReq 新增研究员请求
 type AssessmentResearcherAddReq struct {
 	AdminId            int   `description:"用户ID"`
@@ -164,6 +177,7 @@ type AssessmentResearcherPageListReq struct {
 	CurrentIndex            int    `form:"CurrentIndex"`
 	RealName                string `form:"RealName" description:"用户姓名"`
 	AssessmentResearcherIds string `form:"AssessmentResearcherIds" description:"研究员IDs"`
+	OnlyEnabled             bool   `form:"OnlyEnabled" description:"是否仅显示启用:true-是"`
 	ResearcherAuthType      int    `form:"ResearcherAuthType" description:"权限类型:0-全部;1-当前用户有查看权限的;2-当前用户有统计权限的"`
 }
 

+ 11 - 0
models/assessment_variety.go

@@ -9,6 +9,11 @@ import (
 	"time"
 )
 
+const (
+	AssessmentVarietyDisabled = 0
+	AssessmentVarietyEnabled  = 1
+)
+
 // AssessmentVariety 研究员考核品种表
 type AssessmentVariety struct {
 	AssessmentVarietyId int       `gorm:"column:assessment_variety_id;primaryKey;autoIncrement"`
@@ -16,6 +21,7 @@ type AssessmentVariety struct {
 	VarietyCode         string    `description:"品种编码"`
 	MonthlyFluctuate    float64   `description:"月度波动阈值"`
 	WeeklyFluctuate     float64   `description:"周度波动阈值"`
+	Enabled             int       `description:"状态:0-禁用;1-正常"`
 	CreateTime          time.Time `description:"创建时间"`
 	ModifyTime          time.Time `description:"修改时间"`
 }
@@ -30,6 +36,7 @@ type AssessmentVarietyCols struct {
 	VarietyCode      string
 	MonthlyFluctuate string
 	WeeklyFluctuate  string
+	Enabled          string
 	CreateTime       string
 	ModifyTime       string
 }
@@ -41,6 +48,7 @@ func (m *AssessmentVariety) Cols() AssessmentVarietyCols {
 		VarietyCode:      "variety_code",
 		MonthlyFluctuate: "monthly_fluctuate",
 		WeeklyFluctuate:  "weekly_fluctuate",
+		Enabled:          "enabled",
 		CreateTime:       "create_time",
 		ModifyTime:       "modify_time",
 	}
@@ -164,6 +172,7 @@ type AssessmentVarietyPageListReq struct {
 	PageSize             int    `form:"PageSize"`
 	CurrentIndex         int    `form:"CurrentIndex"`
 	AssessmentVarietyIds string `form:"AssessmentVarietyIds" description:"品种IDs"`
+	OnlyEnabled          bool   `form:"OnlyEnabled" description:"是否仅显示启用:true-是"`
 }
 
 // AssessmentVarietyPageListResp 研究员列表响应
@@ -178,6 +187,7 @@ type AssessmentVarietyDetail struct {
 	VarietyCode         string                       `description:"品种编码"`
 	MonthlyFluctuate    float64                      `description:"月度波动阈值"`
 	WeeklyFluctuate     float64                      `description:"周度波动阈值"`
+	Enabled             int                          `description:"状态:0-禁用;1-正常"`
 	RelationResearcher  []AssessmentResearcherDetail `description:"关联研究员信息"`
 }
 
@@ -188,5 +198,6 @@ func (m *AssessmentVariety) Format2Detail() (item *AssessmentVarietyDetail) {
 	item.VarietyCode = m.VarietyCode
 	item.MonthlyFluctuate = m.MonthlyFluctuate
 	item.WeeklyFluctuate = m.WeeklyFluctuate
+	item.Enabled = m.Enabled
 	return
 }

+ 70 - 0
services/assessment_form.go

@@ -2,6 +2,8 @@ package services
 
 import (
 	"eta/eta_api/models"
+	"eta/eta_api/models/system"
+	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
 	"fmt"
 	"math"
@@ -515,3 +517,71 @@ func CalculateResultStatistic(forms []*models.AssessmentForm, varietyData []*mod
 	resp = results
 	return
 }
+
+// SyncAssessmentResearcher 同步更新研究员表冗余字段
+func SyncAssessmentResearcher(adminId int) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("SyncAssessmentResearcher, 同步研究员表姓名/状态失败: %v", err)
+			utils.FileLog.Info(tips)
+			alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	// 查询是否有对应的研究员
+	researcherOb := new(models.AssessmentResearcher)
+	cond := fmt.Sprintf(` AND %s = ?`, researcherOb.Cols().AdminId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, adminId)
+	researcher, e := researcherOb.GetItemByCondition(cond, pars, "")
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("获取研究员失败, %v", e)
+		return
+	}
+	if researcher == nil || researcher.AssessmentResearcherId <= 0 {
+		return
+	}
+	// 只有研究员状态是启用状态时,才同步系统用的状态
+	var updateEnabled bool
+	if researcher.Enabled == models.AssessmentResearcherEnabled {
+		updateEnabled = true
+	}
+
+	// 获取系统用户,如果不存在,那么禁用研究员
+	adminItem, e := system.GetSysAdminById(adminId)
+	if e != nil && !utils.IsErrNoRow(e) {
+		err = fmt.Errorf("获取系统用户失败, %v", e)
+		return
+	}
+	var updateCols []string
+	var updateRealName bool
+	if adminItem != nil && adminItem.AdminId > 0 {
+		researcher.RealName = adminItem.RealName
+		researcher.Enabled = adminItem.Enabled
+		researcher.ModifyTime = time.Now().Local()
+		updateCols = append(updateCols, researcherOb.Cols().RealName, researcherOb.Cols().ModifyTime)
+		updateRealName = true
+	} else {
+		researcher.Enabled = models.AssessmentResearcherDisabled
+		researcher.ModifyTime = time.Now().Local()
+		updateCols = append(updateCols, researcherOb.Cols().ModifyTime)
+	}
+	if updateEnabled {
+		updateCols = append(updateCols, researcherOb.Cols().Enabled)
+	}
+	if e = researcher.Update(updateCols); e != nil {
+		err = fmt.Errorf("同步研究员失败, %v", e)
+		return
+	}
+
+	// 更新填报单研究员姓名
+	if !updateRealName {
+		return
+	}
+	formOb := new(models.AssessmentForm)
+	if e = formOb.UpdateResearcherName(researcher.AssessmentResearcherId, researcher.RealName); e != nil {
+		err = fmt.Errorf("更新填报单研究员姓名失败, %v", e)
+		return
+	}
+	return
+}