Explorar el Código

智慧交流-车型统计

sixian hace 2 años
padre
commit
4a1cf3683b

+ 3 - 2
app/operation/controller/captureController.go

@@ -57,7 +57,7 @@ func (c captureCtl) SuggestSpeed(ctx *gin.Context) {
 	ctx.JSON(http.StatusOK, common.SuccessResponse(common.Succeeded, records))
 }
 
-// AreaList 归属地统计
+// AreaList 归属地统计 list
 func (c captureCtl) AreaList(ctx *gin.Context) {
 	value, _ := ctx.Get(middleware.Authorization)
 	claims := value.(*middleware.Claims)
@@ -77,6 +77,7 @@ func (c captureCtl) AreaList(ctx *gin.Context) {
 	ctx.JSON(http.StatusOK, common.SuccessResponse(common.Succeeded, records))
 }
 
+// AreaTypeList 归属地统计 line图表
 func (c captureCtl) AreaTypeList(ctx *gin.Context) {
 	value, _ := ctx.Get(middleware.Authorization)
 	claims := value.(*middleware.Claims)
@@ -108,7 +109,7 @@ func (c captureCtl) VehicleTypeEx(ctx *gin.Context) {
 	}
 	var records interface{}
 	err = nil
-	records, err = service.CaptureVehicleTypeExService.GetVehicleTypeEx(claims.TenantId, req)
+	records, err = service.CaptureVehicleTypeExService.GetVehicleList(claims.TenantId, req)
 	if err != nil {
 		ctx.JSON(http.StatusOK, err)
 		return

+ 2 - 0
app/operation/edge_service/forCaptureItsService.go

@@ -34,6 +34,8 @@ type ForCaptureItsData struct {
 
 	Province string `json:"province"` //归属地时-用到的省
 	City     string `json:"city"`     //归属地时-用到的城市
+
+	Vtype int `json:"vtype"` //车型统计
 }
 
 // VehicleTotal 统计日 月 车流量 数据

+ 162 - 0
app/operation/service/captureVehicleTypeExService.go

@@ -0,0 +1,162 @@
+package service
+
+import (
+	"iot_manager_service/app/device/dao"
+	"iot_manager_service/app/operation/edge_service"
+	"iot_manager_service/app/operation/model"
+	systemService "iot_manager_service/app/system/service"
+	"iot_manager_service/util/common"
+	"strconv"
+)
+
+// CaptureVehicleTypeExService 车型统计
+var CaptureVehicleTypeExService = new(captureVehicleTypeExService)
+
+type captureVehicleTypeExService struct{}
+
+// GetVehicleList 得到下方前10的详细数据 list
+func (s captureVehicleTypeExService) GetVehicleList(tenantId int, req model.RequestCaptureFilter) (interface{}, error) {
+	//得到边缘数据
+	flag, forData, err := s.getData(tenantId, req)
+
+	//得到排名前10的省或城市
+	getTop10 := s.getTop10(forData, req.Type)
+	var topArr []string
+	for _, Vehicle := range getTop10 {
+		topArr = append(topArr, Vehicle.Name)
+	}
+
+	//将所有省份或城市 数据组装成 map {time:[{Name:"xxx", Value:11}]}
+	mdata := make(map[string][]model.TmpCapture)
+	for _, datum := range forData {
+		time := datum.Time
+		if flag == 1 {
+			time += "-01"
+		}
+		name := s.getVtypeName(datum.Vtype)
+
+		mm := model.TmpCapture{
+			Name:  name,
+			Value: datum.Total,
+		}
+		mdata[time] = append(mdata[time], mm)
+	}
+
+	//时间范围内的月份或天的明细列表
+	var countTimes []string
+	if flag == 1 {
+		countTimes = common.GetTimeMonths(req.StartTime, req.EndTime) //时间范围 月
+	} else {
+		countTimes = common.GetTimeDays(req.StartTime, req.EndTime) //时间范围 天
+	}
+
+	//每日|每月 前10的数据 组装
+	var list []model.TmpCaptures
+	for _, countTime := range countTimes {
+		//得到总排名前10的,当天|当月 数据
+		var tmpsData []model.TmpCapture
+		for _, Vehicle := range getTop10 {
+			value := mdata[countTime]
+			val := 0
+			for _, i := range value {
+				if Vehicle.Name == i.Name {
+					val += i.Value
+				}
+				i.Value = 0
+			}
+			tmpsData = append(tmpsData, model.TmpCapture{
+				Name:  Vehicle.Name,
+				Value: val,
+			})
+		}
+		//按日期 组装 前10名的每天或每月数据
+		list = append(list, model.TmpCaptures{
+			CountTime:       countTime,
+			TmpCapturesData: tmpsData,
+		})
+	}
+
+	//按前端要求的格式,组装数据
+	var list2 []model.TmpCaptures
+	for _, Vehicles := range list {
+		data := model.ViewData(Vehicles)
+		if len(data.TmpCapturesData) > 0 {
+			list2 = append(list2, data)
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	return list2, nil
+}
+
+// GetVehicleTypeList 前10的地区 和 数量 line 图表
+func (s captureVehicleTypeExService) GetVehicleTypeList(tenantId int, req model.RequestCaptureFilter) (interface{}, error) {
+	//得到全部数据
+	_, forData, err := s.getData(tenantId, req)
+
+	// 得到排名前10的省或城市
+	getTop10 := s.getTop10(forData, req.Type)
+	var tmp model.TmpCaptures
+	tmp.TmpCapturesData = getTop10
+
+	//按前端要求的格式,组装数据
+	data := model.ViewData(tmp)
+	return data, err
+}
+
+//得到边缘接口 时间范围数据
+func (s captureVehicleTypeExService) getData(tenantId int, req model.RequestCaptureFilter) (int, []edge_service.ForCaptureItsData, error) {
+	//区分按月或按日
+	flag := 0
+	if req.QueryType == "month" {
+		flag = 1
+	}
+
+	//查出抓拍单元sn
+	unit := dao.CaptureUnit{
+		TenantId: tenantId,
+		ID:       req.CaptureId,
+	}
+	unit.GetDevice()
+	var codes []string
+	codes = append(codes, unit.CaptureSn)
+
+	forCaptureIts := edge_service.ForCaptureIts{}
+	var forData []edge_service.ForCaptureItsData
+	var err error
+	forData, err = forCaptureIts.Vehicletypeex(edge_service.ForCaptureItsReq{
+		Codes: codes,
+		Start: req.StartTime,
+		End:   req.EndTime,
+		Flag:  flag,
+	})
+	return flag, forData, err
+}
+
+//得到 前10
+func (s captureVehicleTypeExService) getTop10(data []edge_service.ForCaptureItsData, typeInt int) model.PairList {
+	//拼全部数据
+	allData := make(map[string]int)
+	for _, datum := range data {
+		name := s.getVtypeName(datum.Vtype)
+		allData[name] += datum.Total
+	}
+	//对数据排序
+	top10Data := model.RankByWordCount(allData)
+	//取前10
+	if len(top10Data) >= 10 {
+		top10Data = top10Data[:10]
+	}
+	return top10Data
+}
+
+// getVtypeName 根据车型编号  取字典中的名称
+func (s captureVehicleTypeExService) getVtypeName(vtype int) string {
+	name := strconv.Itoa(vtype)
+	if vtype > 34 {
+		return "其它"
+	}
+	dict := systemService.DictService.GetCacheDict("car_model_type"+name, "car_model_type", vtype)
+	return dict
+}