123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- package service
- import (
- "fmt"
- "iot_manager_service/app/device/dao"
- "iot_manager_service/app/device/model"
- "iot_manager_service/app/system/service"
- "iot_manager_service/util/common"
- "iot_manager_service/util/logger"
- "sort"
- "time"
- )
- // 中间件管理服务
- var LightStrategyService = new(lightStrategyService)
- type lightStrategyService struct{}
- func (s *lightStrategyService) Get(id int) (*model.LightStrategyDetail, *common.Errors) {
- // 创建查询实例
- strategy := &dao.LightStrategy{
- ID: id,
- }
- err := strategy.GetStrategy()
- if err != nil {
- return nil, common.FailResponse(err.Error(), nil)
- }
- lightStrategy := &model.LightStrategyDetail{
- LightStrategy: *strategy,
- }
- lightStrategy.TimeConditionList = TimeConditionService.GetByLightId(id)
- if len(lightStrategy.TimeConditionList) > 0 {
- lightStrategy.LightType = "时间"
- }
- lightStrategy.LightType = lightStrategy.LightType + "策略"
- return lightStrategy, nil
- }
- func (s *lightStrategyService) CreateOrUpdate(userId int, tenantId string, req *model.LightStrategyDetail) *common.Errors {
- // 创建查询实例
- strategy := req
- logger.Logger.Errorf("CreateOrUpdate strategy = %+v \n", strategy)
- strategy.TenantId = tenantId
- strategy.UpdateUser = userId
- strategy.UpdateTime = time.Now()
- if len(strategy.LightConditionList) == 0 {
- for i := 0; i < len(strategy.LightConditionDetailList); i++ {
- var detail = strategy.LightConditionDetailList[i]
- condition := dao.LightCondition{
- ID: detail.ID,
- Remark: detail.Remark,
- LightId: detail.LightId,
- Luminance: detail.Luminance,
- ScopeStart: detail.ScopeStart,
- ScopeEnd: detail.ScopeEnd,
- }
- strategy.LightConditionList = append(strategy.LightConditionList, condition)
- }
- }
- if len(strategy.TimeConditionList) == 0 {
- for i := 0; i < len(strategy.TimeConditionDetailList); i++ {
- var detail = strategy.TimeConditionDetailList[i]
- condition := dao.TimeCondition{
- ID: detail.ID,
- Remark: detail.Remark,
- LightId: detail.LightId,
- Luminance: detail.Luminance,
- StartTime: detail.StartTime,
- EndTime: detail.EndTime,
- Sunshine: detail.Sunshine,
- }
- strategy.TimeConditionList = append(strategy.TimeConditionList, condition)
- }
- }
- if req.ID == 0 {
- strategy.CreateTime = time.Now()
- strategy.CreateUser = userId
- strategy.Status = 1
- if strategy.IsExistedBySN() {
- logger.Logger.Errorf("Create GetstrategyID err \n")
- return common.ParamsInvalidResponse("编码不能重复,请重新填写!", nil)
- }
- }
- //用于比较光照度重叠
- var overlapList []dao.LightCondition
- for _, lightCondition := range strategy.LightConditionList {
- if (lightCondition.ScopeStart != 0 && lightCondition.ScopeEnd == 0) || (lightCondition.
- ScopeStart == 0 && lightCondition.ScopeEnd != 0) {
- return common.ParamsInvalidResponse("光照度请填写完整", nil)
- } else if lightCondition.ScopeEnd > 0 && lightCondition.ScopeStart >= lightCondition.ScopeEnd {
- return common.ParamsInvalidResponse("光照度起始值不能大于结束值", nil)
- }
- overlapList = append(overlapList, lightCondition)
- if lightCondition.ID == 0 {
- lightCondition.CreateUser = userId
- lightCondition.CreateTime = time.Now()
- } else {
- lightCondition.UpdateUser = userId
- lightCondition.UpdateTime = time.Now()
- }
- lightCondition.LightId = req.ID
- }
- //光照条件查询是否区间重叠
- if len(overlapList) > 0 {
- sort.SliceIsSorted(overlapList, func(i, j int) bool {
- return overlapList[i].
- ScopeStart < overlapList[j].ScopeStart
- })
- tmp := -1
- for _, overLap := range overlapList {
- if tmp >= overLap.ScopeStart {
- return common.ParamsInvalidResponse("光照条件区间有重叠", nil)
- }
- tmp = overLap.ScopeEnd
- }
- }
- // 时间策略参数校验
- var timeList []dao.TimeCondition
- for _, timeCondition := range strategy.TimeConditionList {
- if timeCondition.Sunshine == 0 {
- timeCondition.Sunshine = 1
- }
- if timeCondition.Sunshine == 1 && (timeCondition.StartTime == "" && timeCondition.EndTime == "") {
- return common.FailResponse(model.TimeConditionNull, nil)
- }
- if (timeCondition.StartTime == "" && timeCondition.EndTime != "") || (timeCondition.
- StartTime != "" && timeCondition.EndTime == "") {
- return common.FailResponse(model.TimeConditionNull, nil)
- } else if timeCondition.EndTime != "" && timeCondition.StartTime >= timeCondition.EndTime {
- return common.FailResponse(model.TimeConditionInvalid, nil)
- }
- if timeCondition.ID == 0 {
- timeCondition.CreateUser = userId
- timeCondition.CreateTime = time.Now()
- } else {
- timeCondition.UpdateUser = userId
- timeCondition.UpdateTime = time.Now()
- }
- timeCondition.LightId = req.ID
- if timeCondition.ID == 0 {
- timeCondition.CreateUser = userId
- timeCondition.CreateTime = time.Now()
- }
- timeCondition.UpdateUser = userId
- timeCondition.UpdateTime = time.Now()
- timeList = append(timeList, timeCondition)
- }
- //存数据库
- if strategy.ID == 0 {
- if err := strategy.Create(); err != nil {
- logger.Logger.Errorf("Create err = %s \n", err.Error())
- return common.FailResponse(err.Error(), nil)
- }
- } else {
- if err := strategy.Update(); err != nil {
- logger.Logger.Errorf("Update err = %s \n", err.Error())
- return common.FailResponse(err.Error(), nil)
- }
- }
- //存策略条件
- _ = TimeConditionService.Save(timeList, strategy.ID)
- _ = LightConditionService.Save(strategy.LightConditionList, strategy.ID)
- //todo 调用设备云端的新增或修改
- //todo 自动续期
- //strategy.IsAutomaticRenewal
- service.OperationHisService.Save(userId, tenantId, common.OperationCreate, common.ModuleTypeDevice,
- common.DeviceTypeLightStrategy, common.GetDeviceObject(strategy.ID, strategy.LightName), common.OperationSuccess)
- return common.SuccessResponse(common.Succeeded, nil)
- }
- func (s *lightStrategyService) List(searchValue string, current, size int) ([]model.LightStrategyDetail, int64, *common.Errors) {
- strategy := dao.LightStrategy{}
- if searchValue != "" {
- strategy.LightSn = searchValue
- }
- offset := (current - 1) * size
- limit := size
- strategies, total, err := strategy.GetStrategies(offset, limit)
- if err != nil {
- return nil, 0, common.FailResponse(err.Error(), nil)
- }
- timeConditions, _ := TimeConditionService.GetAll()
- timeConditionsMap := make(map[int]dao.TimeCondition)
- for _, timeCondition := range timeConditions {
- timeConditionsMap[timeCondition.LightId] = timeCondition
- }
- year := time.Now().Year()
- var details []model.LightStrategyDetail
- for _, strategy := range strategies {
- if strategy.IsAllYear == model.IsYear {
- strategy.StartTime = fmt.Sprintf("%d-01-01", year)
- strategy.StartTime = fmt.Sprintf("%d-12-31", year)
- }
- detail := model.LightStrategyDetail{LightStrategy: strategy}
- if timeCondition, isExist := timeConditionsMap[strategy.ID]; isExist {
- //开启日出日落
- if timeCondition.Sunshine == 2 {
- timeCondition.StartTime = "日落"
- timeCondition.EndTime = "日出"
- }
- str := []string{}
- str = append(str, fmt.Sprintf("开灯时段:%s ~ %s , 灯光亮度:%d%%", timeCondition.StartTime,
- timeCondition.EndTime, timeCondition.Luminance))
- detail.CombinationStr = str
- }
- lightStrategy := &model.LightStrategyDetail{
- LightStrategy: strategy,
- }
- lightStrategy.TimeConditionList = TimeConditionService.GetByLightId(strategy.ID)
- if len(lightStrategy.TimeConditionList) > 0 {
- lightStrategy.LightType = "时间"
- }
- detail.LightType = lightStrategy.LightType + "策略"
- details = append(details, detail)
- }
- return details, total, nil
- }
- func (s *lightStrategyService) Remove(userId int, tenantId string, id int) *common.Errors {
- // 创建查询实例
- strategy := &dao.LightStrategy{
- ID: id,
- IsDeleted: 1,
- UpdateUser: userId,
- UpdateTime: time.Now(),
- }
- err := strategy.Delete()
- if err != nil {
- return common.FailResponse(err.Error(), nil)
- }
- service.OperationHisService.Save(userId, tenantId, common.OperationRemove, common.ModuleTypeDevice,
- common.DeviceTypeLightStrategy, common.GetDeviceObject(strategy.ID, strategy.LightName), common.OperationSuccess)
- return nil
- }
- func (s *lightStrategyService) GetOne(id int) (*dao.LightStrategy, *common.Errors) {
- strategy := &dao.LightStrategy{
- ID: id,
- }
- err := strategy.GetStrategy()
- if err != nil {
- return nil, nil
- }
- return strategy, nil
- }
|