package supply_analysis import ( "encoding/json" "eta/eta_api/controllers" "eta/eta_api/models" "eta/eta_api/models/data_manage" "eta/eta_api/models/data_manage/request" "eta/eta_api/models/data_manage/response" "eta/eta_api/models/data_manage/supply_analysis" "eta/eta_api/services/data" supply_analysisServ "eta/eta_api/services/data/supply_analysis" "eta/eta_api/utils" "fmt" "github.com/rdlucklib/rdluck_tools/paging" "strconv" "strings" "time" ) // VarietyController 期货指标分类 type VarietyController struct { controllers.BaseAuthController } // List // @Title 存量装置图表分类列表 // @Description 存量装置图表分类列表接口 // @Param IsAnalyse query bool true "是否有权限的,true、false" // @Param Keyword query string true "关键字搜索" // @Success 200 {object} response.VarietyListResp // @router /variety/list [get] func (this *VarietyController) List() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() isAnalyse, _ := this.GetBool("IsAnalyse") keyword := this.GetString("Keyword") pageSize, _ := this.GetInt("PageSize") currentIndex, _ := this.GetInt("CurrentIndex") var startSize int if pageSize <= 0 { pageSize = utils.PageSize20 } if currentIndex <= 0 { currentIndex = 1 } startSize = utils.StartIndex(currentIndex, pageSize) var condition string var pars []interface{} if keyword != `` { condition += ` AND (a.variety_name like ? OR c.edb_code like ? ) ` pars = append(pars, "%"+keyword+"%", "%"+keyword+"%") } // 是否超管 isSuperAdmin := supply_analysisServ.IsVarietySuperAdmin(this.SysUser) varietyObj := supply_analysis.Variety{} var total int var list []*supply_analysis.VarietyItem var err error if isSuperAdmin || !isAnalyse { total, list, err = varietyObj.GetListBySuperAdminPage(condition, pars, startSize, pageSize) } else { if isAnalyse { condition += ` AND b.sys_user_id = ? ` pars = append(pars, this.SysUser.AdminId) } total, list, err = varietyObj.GetListByPage(condition, pars, startSize, pageSize) } if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "获取数据失败,Err:" + err.Error() return } for k, v := range list { button := supply_analysis.VarietyButton{} if isSuperAdmin { button.Edit = true button.Delete = true button.Analyse = true } else { if v.PermissionUserId != `` { tmpUserIdStrList := strings.Split(v.PermissionUserId, ",") if utils.InArrayByStr(tmpUserIdStrList, strconv.Itoa(this.SysUser.AdminId)) { button.Analyse = true } } } v.Button = button list[k] = v } resp := response.VarietyListResp{ AddButton: isSuperAdmin, Paging: paging.GetPaging(currentIndex, pageSize, total), List: list, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // Add // @Title 新增品种 // @Description 新增品种接口 // @Param request body request.AddVarietyReq true "type json string" // @Success 200 Ret=200 添加成功 // @router /variety/add [post] func (this *VarietyController) Add() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.AddVarietyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } isSuperAdmin := supply_analysisServ.IsVarietySuperAdmin(this.SysUser) if !isSuperAdmin { br.Msg = "无操作权限" br.IsSendEmail = false return } if req.VarietyName == "" { br.Msg = "请输入品种名称" br.IsSendEmail = false return } varietyName := utils.TrimStr(req.VarietyName) item, err := supply_analysis.GetVarietyByName(varietyName) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "添加失败" br.ErrMsg = "添加失败,Err:" + err.Error() return } if item != nil { br.Msg = "添加失败,品种名称不能重复" br.IsSendEmail = false return } variety := &supply_analysis.Variety{ VarietyId: 0, VarietyName: varietyName, LastUpdateSysUserId: this.SysUser.AdminId, LastUpdateSysUserRealName: this.SysUser.RealName, ProductionDay: 365, SysUserId: this.SysUser.AdminId, SysUserRealName: this.SysUser.RealName, ModifyTime: time.Now(), CreateTime: time.Now(), } err = supply_analysis.CreateVariety(variety, req.AdminIdList) if err != nil { br.Msg = "添加品种失败" br.ErrMsg = "添加品种失败,Err:" + err.Error() return } br.Ret = 200 br.Msg = "添加成功" br.IsAddLog = true br.Success = true } // Edit // @Title 编辑品种接口 // @Description 编辑品种接口 // @Param request body request.EditVarietyReq true "type json string" // @Success 200 Ret=200 修改成功 // @router /variety/edit [post] func (this *VarietyController) Edit() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.EditVarietyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } isSuperAdmin := supply_analysisServ.IsVarietySuperAdmin(this.SysUser) if !isSuperAdmin { br.Msg = "无操作权限" br.IsSendEmail = false return } if req.VarietyId <= 0 { br.Msg = "请选择品种" br.IsSendEmail = false return } if req.VarietyName == "" { br.Msg = "请输入品种名称" br.IsSendEmail = false return } varietyName := utils.TrimStr(req.VarietyName) item, err := supply_analysis.GetVarietyByName(varietyName) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "添加失败" br.ErrMsg = "添加失败,Err:" + err.Error() return } if item != nil && item.VarietyId != req.VarietyId { br.Msg = "添加失败,品种名称不能重复" br.IsSendEmail = false return } // 获取品种详情 varietyInfo, err := supply_analysis.GetVarietyById(req.VarietyId) if err != nil { br.Msg = "查询品种失败" br.ErrMsg = "查询品种失败;ERR:" + err.Error() return } // 编辑 varietyInfo.VarietyName = varietyName varietyInfo.LastUpdateSysUserId = this.SysUser.AdminId varietyInfo.LastUpdateSysUserRealName = this.SysUser.RealName varietyInfo.ModifyTime = time.Now() err = supply_analysis.EditVariety(varietyInfo, req.AdminIdList) if err != nil { br.Msg = "修改品种失败" br.ErrMsg = "修改品种失败,Err:" + err.Error() return } br.Ret = 200 br.Msg = "修改成功" br.IsAddLog = true br.Success = true } // DeleteCheck // @Title 删除品种检测接口 // @Description 删除品种检测接口 // @Param request body request.DelVarietyReq true "type json string" // @Success 200 Ret=200 检测成功 // @router /variety/delete/check [post] func (this *VarietyController) DeleteCheck() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.DelVarietyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.VarietyId <= 0 { br.Msg = "请选择品种" br.IsSendEmail = false return } var deleteStatus int var tipsMsg string //判断该品种是否生成指标 count, err := supply_analysis.GetCountVarietyEdbInfoByVarietyId(req.VarietyId) if err != nil { br.Msg = "删除失败" br.ErrMsg = "查询品种下是否含有指标失败,Err:" + err.Error() return } // 是否超管 isSuperAdmin := supply_analysisServ.IsVarietySuperAdmin(this.SysUser) if !isSuperAdmin { deleteStatus = 1 tipsMsg = "无删除权限" } else { if count > 0 { deleteStatus = 1 tipsMsg = "该品种已在指标库生成指标,不可删除" } } resp := response.VarietyDeleteCheckResp{ DeleteStatus: deleteStatus, TipsMsg: tipsMsg, } br.Ret = 200 br.Msg = "检测成功" br.Success = true br.Data = resp } // Delete // @Title 删除存量装置图表分类/图表 // @Description 删除存量装置图表分类/图表接口 // @Param request body data_manage.DeleteChartClassifyReq true "type json string" // @Success 200 Ret=200 删除成功 // @router /variety/delete [post] func (this *VarietyController) Delete() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.DelVarietyReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.VarietyId <= 0 { br.Msg = "请选择品种" br.IsSendEmail = false return } //判断该品种是否生成指标 count, err := supply_analysis.GetCountVarietyEdbInfoByVarietyId(req.VarietyId) if err != nil { br.Msg = "删除失败" br.ErrMsg = "查询品种下是否含有指标失败,Err:" + err.Error() return } // 是否超管 isSuperAdmin := supply_analysisServ.IsVarietySuperAdmin(this.SysUser) if !isSuperAdmin { br.Msg = `无删除权限` br.IsSendEmail = false return } if count > 0 { br.Msg = `该品种已在指标库生成指标,不可删除` br.IsSendEmail = false return } varietyInfo, err := supply_analysis.GetVarietyById(req.VarietyId) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "该品种不存在或已删除" br.IsSendEmail = false } else { br.Msg = "删除失败" br.ErrMsg = "查找品种失败,ERR:" + err.Error() } return } err = varietyInfo.Delete() if err != nil { br.Msg = "删除失败" br.ErrMsg = "查找品种失败,ERR:" + err.Error() return } br.Ret = 200 br.Msg = "删除成功" br.Success = true br.IsAddLog = true } // Detail // @Title 存量装置图表分类列表 // @Description 存量装置图表分类列表接口 // @Param VarietyId query int true "品种id" // @Success 200 {object} response.VarietyListResp // @router /variety/detail [get] func (this *VarietyController) Detail() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() varietyId, _ := this.GetInt("VarietyId") if varietyId < 0 { br.Msg = "不存在该品种或该品种已被删除" br.ErrMsg = "不存在该品种或该品种已被删除" br.IsSendEmail = false } // 获取品种详情 varietyInfo, err := supply_analysis.GetVarietyById(varietyId) if err != nil { br.Msg = "查询品种失败" br.ErrMsg = "查询品种失败;ERR:" + err.Error() if err.Error() != utils.ErrNoRow() { br.Msg = "不存在该品种或该品种已被删除" br.ErrMsg = "不存在该品种或该品种已被删除" br.IsSendEmail = false } return } if varietyInfo == nil { br.Msg = "不存在该品种或该品种已被删除" br.ErrMsg = "不存在该品种或该品种已被删除" br.IsSendEmail = false return } resp := supply_analysis.VarietyItem{ VarietyId: varietyInfo.VarietyId, VarietyName: varietyInfo.VarietyName, ProductionDay: varietyInfo.ProductionDay, LastUpdateSysUserId: varietyInfo.LastUpdateSysUserId, LastUpdateSysUserRealName: varietyInfo.LastUpdateSysUserRealName, PermissionUserId: ``, ModifyTime: varietyInfo.ModifyTime.Format(utils.FormatDateTime), CreateTime: varietyInfo.CreateTime.Format(utils.FormatDateTime), //Button: supply_analysis.VarietyButton{}, } br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // Analysis // @Title 品种分析 // @Description 品种分析接口 // @Param request body request.AnalysisReq true "type json string" // @Success 200 Ret=200 检测成功 // @router /variety/analysis [post] func (this *VarietyController) Analysis() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.AnalysisReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } if req.VarietyId <= 0 { br.Msg = "请选择品种" br.IsSendEmail = false return } //加入缓存机制,避免创建同一时间,多人去分析 start redisKey := fmt.Sprint("supply_analysis:variety:", req.VarietyId) isExist := utils.Rc.IsExist(redisKey) if isExist { br.Msg = "品种正在分析中,请等待" br.IsSendEmail = false return } else { //设置3分钟缓存 utils.Rc.SetNX(redisKey, 1, time.Second*300) defer func() { utils.Rc.Delete(redisKey) }() } //加入缓存机制,避免创建同一时间,多人去分析 end // 获取品种详情 varietyInfo, err := supply_analysis.GetVarietyById(req.VarietyId) if err != nil { br.Msg = "查询品种失败" br.ErrMsg = "查询品种失败;ERR:" + err.Error() return } //判断该品种是否生成指标 list, err := supply_analysis.GetVarietyEdbListByVarietyId(req.VarietyId) if err != nil { br.Msg = "分析失败" br.ErrMsg = "分析失败,Err:" + err.Error() return } // 如果没有生成过指标,那么就先生成指标 if len(list) <= 0 { //randStr := utils.GetRandDigit(4) //prefixCode := "HZ_V" //suffixCode := time.Now().Format("060102") + randStr //`source` int(9) DEFAULT NULL COMMENT '来源,1:影响周度产量;2:周度产量变动;3:影响月度产量;4:月度产量变动', list := []*supply_analysis.VarietyEdbInfo{ { //VarietyEdbId: 0, VarietyId: req.VarietyId, EdbName: varietyInfo.VarietyName + "影响周度产量", Frequency: "日度", EdbInfoId: 0, //EdbCode: fmt.Sprint(prefixCode, 1, suffixCode), Source: 1, ModifyTime: time.Now(), CreateTime: time.Now(), }, { //VarietyEdbId: 0, VarietyId: req.VarietyId, EdbName: varietyInfo.VarietyName + "周度产量变动", Frequency: "日度", EdbInfoId: 0, //EdbCode: fmt.Sprint(prefixCode, 2, suffixCode), Source: 2, ModifyTime: time.Now(), CreateTime: time.Now(), }, { //VarietyEdbId: 0, VarietyId: req.VarietyId, EdbName: varietyInfo.VarietyName + "影响月度产量", Frequency: "月度", EdbInfoId: 0, //EdbCode: fmt.Sprint(prefixCode, 3, suffixCode), Source: 3, ModifyTime: time.Now(), CreateTime: time.Now(), }, { //VarietyEdbId: 0, VarietyId: req.VarietyId, EdbName: varietyInfo.VarietyName + "月度产量变动", Frequency: "月度", EdbInfoId: 0, //EdbCode: fmt.Sprint(prefixCode, 4, suffixCode), Source: 4, ModifyTime: time.Now(), CreateTime: time.Now(), }, } err = supply_analysis.BatchCreateVarietyEdbInfo(list) if err != nil { br.Msg = `分析失败` br.ErrMsg = `分析失败,生成指标失败,ERR:` + err.Error() return } } tmpMap := map[string]interface{}{ "VarietyId": req.VarietyId, "AdminId": this.SysUser.AdminId, "AdminName": this.SysUser.RealName, } reqJson, err := json.Marshal(tmpMap) // 开始分析 _, err = supply_analysisServ.Calculate(string(reqJson)) if err != nil { br.Msg = `分析失败` br.ErrMsg = `分析失败,ERR:` + err.Error() return } // 更新ETA指标库信息 { if len(list) > 0 { for _, v := range list { if v.EdbInfoId > 0 { edbInfo, err := data_manage.GetEdbInfoById(v.EdbInfoId) if err != nil { continue } // 刷新指标数据 go data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, edbInfo.StartDate) } } } } // 变更品种的更新时间 { varietyInfo.ModifyTime = time.Now() varietyInfo.LastUpdateSysUserId = this.SysUser.AdminId varietyInfo.LastUpdateSysUserRealName = this.SysUser.RealName go varietyInfo.Update([]string{"ModifyTime", "LastUpdateSysUserId", "LastUpdateSysUserRealName"}) } br.Ret = 200 br.Msg = "分析成功" br.Success = true } // ModifyProductionDay // @Title 编辑品种的生产天数接口 // @Description 编辑品种的生产天数接口 // @Param request body request.ModifyProductionDayReq true "type json string" // @Success 200 Ret=200 修改成功 // @router /variety/production_day/modify [post] func (this *VarietyController) ModifyProductionDay() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req request.ModifyProductionDayReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } var hasPermission bool //是否有操作权限 // 是否有装置的操作权限 hasPermission, err = supply_analysisServ.HasVarietyPlantPermission(this.SysUser, req.VarietyId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取失败" br.ErrMsg = "查询是否有装置的操作权限失败;ERR:" + err.Error() return } if !hasPermission { br.Msg = "无操作权限" br.ErrMsg = "无操作权限" return } if req.VarietyId <= 0 { br.Msg = "请选择品种" br.IsSendEmail = false return } if req.Day <= 0 { br.Msg = "生产天数不能小于等于0" br.IsSendEmail = false return } // 获取品种详情 varietyInfo, err := supply_analysis.GetVarietyById(req.VarietyId) if err != nil { br.Msg = "查询品种失败" br.ErrMsg = "查询品种失败;ERR:" + err.Error() return } // 编辑 varietyInfo.ProductionDay = req.Day varietyInfo.LastUpdateSysUserId = this.SysUser.AdminId varietyInfo.LastUpdateSysUserRealName = this.SysUser.RealName varietyInfo.ModifyTime = time.Now() err = varietyInfo.Update([]string{"ProductionDay", "LastUpdateSysUserId", "LastUpdateSysUserRealName", "ModifyTime"}) if err != nil { br.Msg = "修改生产天数失败" br.ErrMsg = "修改生产天数失败,Err:" + err.Error() return } br.Ret = 200 br.Msg = "修改成功" br.IsAddLog = true br.Success = true }