LightStrategyService.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package service
  2. import (
  3. "fmt"
  4. "iot_manager_service/app/device/dao"
  5. "iot_manager_service/app/device/model"
  6. "iot_manager_service/app/system/service"
  7. "iot_manager_service/util/common"
  8. "sort"
  9. "time"
  10. )
  11. // 中间件管理服务
  12. var LightStrategyService = new(lightStrategyService)
  13. type lightStrategyService struct{}
  14. func (s *lightStrategyService) Get(id int) (*model.LightStrategyDetail, *common.Errors) {
  15. // 创建查询实例
  16. strategy := &dao.LightStrategy{
  17. ID: id,
  18. }
  19. err := strategy.GetStrategy()
  20. if err != nil {
  21. return nil, common.FailResponse(err.Error(), nil)
  22. }
  23. lightStrategy := &model.LightStrategyDetail{
  24. LightStrategy: *strategy,
  25. }
  26. lightStrategy.TimeConditionList = TimeConditionService.GetByLightId(id)
  27. if len(lightStrategy.TimeConditionList) > 0 {
  28. lightStrategy.LightType = "时间"
  29. }
  30. lightStrategy.LightType = lightStrategy.LightType + "策略"
  31. return lightStrategy, nil
  32. }
  33. func (s *lightStrategyService) CreateOrUpdate(userId int64, tenantId int, req *model.LightStrategyDetail) *common.Errors {
  34. // 创建查询实例
  35. strategy := req
  36. fmt.Printf("CreateOrUpdate strategy = %+v \n", strategy)
  37. strategy.TenantId = tenantId
  38. strategy.UpdateUser = userId
  39. strategy.UpdateTime = time.Now()
  40. if len(strategy.LightConditionList) == 0 {
  41. for i := 0; i < len(strategy.LightConditionDetailList); i++ {
  42. var detail = strategy.LightConditionDetailList[i]
  43. condition := dao.LightCondition{
  44. ID: detail.ID,
  45. Remark: detail.Remark,
  46. LightId: detail.LightId,
  47. Luminance: detail.Luminance,
  48. ScopeStart: detail.ScopeStart,
  49. ScopeEnd: detail.ScopeEnd,
  50. }
  51. strategy.LightConditionList = append(strategy.LightConditionList, condition)
  52. }
  53. }
  54. if len(strategy.TimeConditionList) == 0 {
  55. for i := 0; i < len(strategy.TimeConditionDetailList); i++ {
  56. var detail = strategy.TimeConditionDetailList[i]
  57. condition := dao.TimeCondition{
  58. ID: detail.ID,
  59. Remark: detail.Remark,
  60. LightId: detail.LightId,
  61. Luminance: detail.Luminance,
  62. StartTime: detail.StartTime,
  63. EndTime: detail.EndTime,
  64. Sunshine: detail.Sunshine,
  65. }
  66. strategy.TimeConditionList = append(strategy.TimeConditionList, condition)
  67. }
  68. }
  69. if req.ID == 0 {
  70. strategy.CreateTime = time.Now()
  71. strategy.CreateUser = userId
  72. if strategy.IsExistedBySN() {
  73. fmt.Printf("Create GetstrategyID err \n")
  74. return common.ParamsInvalidResponse("编码不能重复,请重新填写!", nil)
  75. }
  76. }
  77. //用于比较光照度重叠
  78. var overlapList []dao.LightCondition
  79. for _, lightCondition := range strategy.LightConditionList {
  80. if (lightCondition.ScopeStart != 0 && lightCondition.ScopeEnd == 0) || (lightCondition.
  81. ScopeStart == 0 && lightCondition.ScopeEnd != 0) {
  82. return common.ParamsInvalidResponse("光照度请填写完整", nil)
  83. } else if lightCondition.ScopeEnd > 0 && lightCondition.ScopeStart >= lightCondition.ScopeEnd {
  84. return common.ParamsInvalidResponse("光照度起始值不能大于结束值", nil)
  85. }
  86. overlapList = append(overlapList, lightCondition)
  87. if lightCondition.ID == 0 {
  88. lightCondition.CreateUser = userId
  89. lightCondition.CreateTime = time.Now()
  90. } else {
  91. lightCondition.UpdateUser = userId
  92. lightCondition.UpdateTime = time.Now()
  93. }
  94. lightCondition.LightId = req.ID
  95. }
  96. //光照条件查询是否区间重叠
  97. if len(overlapList) > 0 {
  98. sort.SliceIsSorted(overlapList, func(i, j int) bool {
  99. return overlapList[i].
  100. ScopeStart < overlapList[j].ScopeStart
  101. })
  102. tmp := -1
  103. for _, overLap := range overlapList {
  104. if tmp >= overLap.ScopeStart {
  105. return common.ParamsInvalidResponse("光照条件区间有重叠", nil)
  106. }
  107. tmp = overLap.ScopeEnd
  108. }
  109. }
  110. // 时间策略参数校验
  111. var timeList []dao.TimeCondition
  112. for _, timeCondition := range strategy.TimeConditionList {
  113. if timeCondition.Sunshine == 0 {
  114. timeCondition.Sunshine = 1
  115. }
  116. if timeCondition.Sunshine == 1 && (timeCondition.StartTime == "" && timeCondition.EndTime == "") {
  117. return common.FailResponse(model.TimeConditionNull, nil)
  118. }
  119. if (timeCondition.StartTime == "" && timeCondition.EndTime != "") || (timeCondition.
  120. StartTime != "" && timeCondition.EndTime == "") {
  121. return common.FailResponse(model.TimeConditionNull, nil)
  122. } else if timeCondition.EndTime != "" && timeCondition.StartTime >= timeCondition.EndTime {
  123. return common.FailResponse(model.TimeConditionInvalid, nil)
  124. }
  125. if timeCondition.ID == 0 {
  126. timeCondition.CreateUser = userId
  127. timeCondition.CreateTime = time.Now()
  128. } else {
  129. timeCondition.UpdateUser = userId
  130. timeCondition.UpdateTime = time.Now()
  131. }
  132. timeCondition.LightId = req.ID
  133. if timeCondition.ID == 0 {
  134. timeCondition.CreateUser = userId
  135. timeCondition.CreateTime = time.Now()
  136. }
  137. timeCondition.UpdateUser = userId
  138. timeCondition.UpdateTime = time.Now()
  139. timeList = append(timeList, timeCondition)
  140. }
  141. //存数据库
  142. if strategy.ID == 0 {
  143. if err := strategy.Create(); err != nil {
  144. fmt.Printf("Create err = %s \n", err.Error())
  145. return common.FailResponse(err.Error(), nil)
  146. }
  147. } else {
  148. if err := strategy.Update(); err != nil {
  149. fmt.Printf("Update err = %s \n", err.Error())
  150. return common.FailResponse(err.Error(), nil)
  151. }
  152. }
  153. //存策略条件
  154. _ = TimeConditionService.Save(timeList)
  155. _ = LightConditionService.Save(strategy.LightConditionList)
  156. //todo 调用设备云端的新增或修改
  157. //todo 自动续期
  158. //strategy.IsAutomaticRenewal
  159. service.OperationHisService.Save(userId, tenantId, common.OperationCreate, common.ModuleTypeDevice,
  160. common.DeviceTypeLightStrategy, common.GetDeviceObject(strategy.ID, strategy.LightName), common.OperationSuccess)
  161. return common.SuccessResponse(common.Succeeded, nil)
  162. }
  163. func (s *lightStrategyService) List(searchValue string, current, size int) ([]model.LightStrategyDetail, *common.Errors) {
  164. strategy := dao.LightStrategy{}
  165. if searchValue != "" {
  166. strategy.LightSn = searchValue
  167. }
  168. offset := (current - 1) * size
  169. limit := size
  170. strategies, err := strategy.GetStrategies(offset, limit)
  171. if err != nil {
  172. return nil, common.FailResponse(err.Error(), nil)
  173. }
  174. timeConditions, _ := TimeConditionService.GetAll()
  175. timeConditionsMap := make(map[int]dao.TimeCondition)
  176. for _, timeCondition := range timeConditions {
  177. timeConditionsMap[timeCondition.LightId] = timeCondition
  178. }
  179. year := time.Now().Year()
  180. var details []model.LightStrategyDetail
  181. for _, strategy := range strategies {
  182. if strategy.IsAllYear == model.IsYear {
  183. strategy.StartTime = fmt.Sprintf("%d-01-01", year)
  184. strategy.StartTime = fmt.Sprintf("%d-12-31", year)
  185. }
  186. detail := model.LightStrategyDetail{LightStrategy: strategy}
  187. if timeCondition, isExist := timeConditionsMap[strategy.ID]; isExist {
  188. //开启日出日落
  189. if timeCondition.Sunshine == 2 {
  190. timeCondition.StartTime = "日落"
  191. timeCondition.EndTime = "日出"
  192. }
  193. detail.CombinationStr = fmt.Sprintf("开灯时段:%s ~ %s , 灯光亮度:%d%%", timeCondition.StartTime,
  194. timeCondition.EndTime, timeCondition.Luminance)
  195. }
  196. details = append(details, detail)
  197. }
  198. return details, nil
  199. }
  200. func (s *lightStrategyService) Remove(userId int64, tenantId int, id int) *common.Errors {
  201. // 创建查询实例
  202. strategy := &dao.LightStrategy{
  203. ID: id,
  204. IsDeleted: 1,
  205. UpdateUser: userId,
  206. UpdateTime: time.Now(),
  207. }
  208. err := strategy.Delete()
  209. if err != nil {
  210. return common.FailResponse(err.Error(), nil)
  211. }
  212. service.OperationHisService.Save(userId, tenantId, common.OperationRemove, common.ModuleTypeDevice,
  213. common.DeviceTypeLightStrategy, common.GetDeviceObject(strategy.ID, strategy.LightName), common.OperationSuccess)
  214. return nil
  215. }
  216. func (s *lightStrategyService) GetOne(id int) (*dao.LightStrategy, *common.Errors) {
  217. strategy := &dao.LightStrategy{
  218. ID: id,
  219. }
  220. err := strategy.GetStrategy()
  221. if err != nil {
  222. return nil, nil
  223. }
  224. return strategy, nil
  225. }